From 1e8f90bcf048bbc0891aec7b389b6ee0f6947698 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Mon, 2 Oct 2023 11:46:08 -0700 Subject: [PATCH 01/45] gives proper margin-top to sidebar menu on bigger resolutions --- resources/assets/less/overrides.less | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/assets/less/overrides.less b/resources/assets/less/overrides.less index f5625bd7b4..af922fc080 100644 --- a/resources/assets/less/overrides.less +++ b/resources/assets/less/overrides.less @@ -680,15 +680,15 @@ th.css-accessory > .th-inner::before margin-top:160px; } } -@media screen and (max-width: 771px) and (min-width: 512px){ +@media screen and (max-width: 912px) and (min-width: 512px){ .sidebar-menu { - margin-top:160px + margin-top:100px } } -@media screen and (max-width: 1098px) and (min-width: 772px){ +@media screen and (max-width: 1268px) and (min-width: 912px){ .sidebar-menu { - margin-top:98px + margin-top:50px } } From dee36fc294a9a74d1453cb207b064f7341d8725b Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 3 Oct 2023 12:30:08 -0700 Subject: [PATCH 02/45] adds component checkin to asset tab --- .../Components/ComponentCheckinController.php | 10 ++++++++-- public/css/build/app.css | Bin 23442 -> 23442 bytes public/css/build/overrides.css | Bin 16592 -> 16592 bytes public/css/dist/all.css | Bin 549971 -> 549971 bytes public/css/dist/bootstrap-table.css | Bin 10766 -> 10766 bytes public/js/dist/bootstrap-table.js | Bin 1674560 -> 1650987 bytes public/mix-manifest.json | 10 +++++----- resources/assets/less/overrides.less | 8 ++++---- resources/views/components/checkin.blade.php | 2 +- resources/views/hardware/view.blade.php | 5 +++++ 10 files changed, 23 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/Components/ComponentCheckinController.php b/app/Http/Controllers/Components/ComponentCheckinController.php index 09acee0277..395d75b6ac 100644 --- a/app/Http/Controllers/Components/ComponentCheckinController.php +++ b/app/Http/Controllers/Components/ComponentCheckinController.php @@ -30,6 +30,7 @@ class ComponentCheckinController extends Controller // This could probably be done more cleanly but I am very tired. - @snipe if ($component_assets = DB::table('components_assets')->find($component_asset_id)) { + if (is_null($component = Component::find($component_assets->component_id))) { return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); } @@ -42,7 +43,7 @@ class ComponentCheckinController extends Controller return view('components/checkin', compact('component_assets', 'component', 'asset')); } - return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); +// return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); } /** @@ -56,10 +57,11 @@ class ComponentCheckinController extends Controller * @return \Illuminate\Http\RedirectResponse * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function store(Request $request, $component_asset_id) + public function store(Request $request, $component_asset_id, $backto = null) { if ($component_assets = DB::table('components_assets')->find($component_asset_id)) { if (is_null($component = Component::find($component_assets->component_id))) { + return redirect()->route('components.index')->with('error', trans('admin/components/message.not_found')); } @@ -95,6 +97,10 @@ class ComponentCheckinController extends Controller $asset = Asset::find($component_assets->asset_id); event(new CheckoutableCheckedIn($component, $asset, Auth::user(), $request->input('note'), Carbon::now())); + if($backto == 'asset'){ + return redirect()->route('hardware.view', $asset->id)->with('success', + trans('admin/components/message.checkin.success')); + } return redirect()->route('components.index')->with('success', trans('admin/components/message.checkin.success')); diff --git a/public/css/build/app.css b/public/css/build/app.css index c8fc02559764ca7ea02b17a3c6569bdb8bda9301..b82e27befc5532fafeaaac889f82bdf2d369ff03 100644 GIT binary patch delta 54 zcmbQVopI83#tmn^m@N&BCSUM!nEZ~5W3q&|GP9AH1&}Yo0TeH&&{U|NT<@jKWNNUv I-dk7z02s9q&Hw-a delta 51 zcmbQVopI83#tmn^n9a=%CtvV#n7r6ai^b5u(gMg4;V?HhDyYy@sGeN!rOae$vANz` GSO5U!S`iWe diff --git a/public/css/build/overrides.css b/public/css/build/overrides.css index 5111695ac77eeeacad649f1636f4a29b1a2300ef..4020194f849e99a391206cd7d1adfe7a359eb9f0 100644 GIT binary patch delta 67 zcmcc6$atZVaRavjv!$WYWIh82MuW-z23qn)W)=k%nhJ?|DGD07nR&Y9nJFb1Rti8x UAmQrCd-au>Obs^gH4qj60IWF7M2#)7Pc+y2cj7bw;zmV*DYqYG&Gw2@f^FubpC#Jj_Hza zjNH>Z+8KGL>l|k1Vlgx_vjEA8Z~&DRRA?$xPhW73U75+$VEcme?C+W>(Jd?h04HfP AhyVZp delta 125 zcmcb7LhF7M2#)7Pc+y2cj7bwjYdU*DYo?H#eOA@f^Fu^dslkwO9-d lEG5e{>6qk;-eh3e@G&ao>qSz2sgaGw2LGfB#Y1psJ)EkOVP diff --git a/public/css/dist/bootstrap-table.css b/public/css/dist/bootstrap-table.css index c8749ad4b4e92b9bbbca0add1ad839ccb627fd44..301c592a5da8e76b73294d43a40149fb9078e798 100644 GIT binary patch delta 12 TcmeAR=?j_Q%4oRJ?Sv)(AAJP0 delta 12 TcmeAR=?j_Q%4o3B?Sv)(A9w__ diff --git a/public/js/dist/bootstrap-table.js b/public/js/dist/bootstrap-table.js index 53d6e2d52d349f6e3cf66d89902d38852c30b11d..c01fba3e19035a8e5bb2b8769cee880912637316 100644 GIT binary patch delta 44011 zcmbWg33yyrc{l!C?QrMaG~(GuIlGrF3{vK>3#Ejvyki{#EOYc|h} zEXk6XBrJuNC7{A7{eVJgDJ@GvU8;Xc0!d4uG;JX*Z3!)uw6uk!gyd`gwDe>7e(yQw zE;EvneC5H>opaCno_9a*dGC|In*78+#vjcoO5u85`DCYZmGwW_JhN`vYj~69WTv$1 z>e7d{-J?viE^p&L=KX9(|I!c7?qm-?)qKagva8ZxY~Q`~pWF7c`)_Lh(e<4-|Ey_U z$@SL1`%jkseS15L9BTT&^^bP@HZ1MftzxW!(Z(Qq=}^ZtrN{<0bhclAc;A7Iipd^) zW8)5X`>(e*v!6$sT9$rvD7E1Lx+~{TM=vL0%-<|B3zai%B?v_g} z)GYD?sg4KPk56>0zkc7{-|tv@>@I5b)DM(a_DEOz#-(@kdal3W$~)?mJbUVm9oqGM z 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

XL3LH^rWtGSQRBKW~ zJ4MT#0#p53FpBd^2sE>Bp0qf^W4w;D501db@9q}Aq>h<3OQYaRuwmh$0+%9HsF(-0 z@9rkSSWZXZZ-+6BAPjg4azA3js7#(Qri+QB z59SC^5qNHKYL`M9We*-y+ZrOtfOx7%tTEvx4EcC-OcSOb;B*uR8bv4~Q>bl*l7Up1 zPyt>ljU*!CRs>!F0)lZ<8>#wfNuV0Mh*^Ki*>1Z9S=qd8HpuGkQE%~x6=Q@SzF{nqgXEe9J33e9$Gp(gNgKUJv?oz?ihbgc+Ew93e*X}; zJFWpmyr9}z-O#N<#tcX^FzPTW*VZE)QmBv-h_jd$ioshiN4sVPW7snmK!^8+*p4IKLQb16?ONmmxLLP9fJWGm^OOUaj z46B}swrIyGq|rRh@xy?5E!B{uqwB@FOqS)qX&c;f&SWuyB9G-L1{qFpusawYMxgh0 z$L26yHb=zQ<2wqjVmd=yA!`~(uC_`U3t%hY(JJRp|6t%djch<*_yK^0v##yp=!Xr50z1o*<+ zpD%{Us|3hJdevLj>s3WNPpP|oXFcS<2pW*@hawU9e2rkKDq;ip~xgriRXob!ZAr>VyNC1v>Gj6qyW6I>%pWp^K z@4=FR@(tvqHK@J!F^ERB-$6OPu&Oz9R^*~z(JcLi3N0^xiw6_32ll&=L`U56IJ|TN-wEw@uHc9ZM47$8F4f z+S7`w3@@EgI}#9KtG2eN8mCk+HLS?ZyC|HJ#2%Oxc2q{KkI``tD!PB-V8HS{jmOx1 zXVsfez+Wke8WNVTR2Wpk-fssd=yjHwE@WoRU>iWIH;T3Q5n`W4(93790|zDmRIWDDf(#bVYI4slfeww*>X)FOgVZs{@777exk-CO0 zY-d7k!ELtRkE?sOVXE8!jzM*g;b0(h(kxD`Qh9Ge-PK5%smWfSP=iXEy)&WiXm?G{ zatL^%eQEYfciyzMqFP8MxIx7$dYLGAmR9zT+H1w2y~oOcd>U*s$C&|EG*!W zfX)QBh^5Pms(^Jr;?8X+&B?K2hhcOqEW}yQW%cF;06xZRLR zBgTIHvf2&G`t!?bFaG@evfADNW)WjuQ)*|O8e@?uoGh1SCMj~o*8hQ{meUVTY;rge z+nSF-HT3#$iUQXqf8-{Qe5NBw>k*L|@^Lm(ay`z%Aqo>MScZFNkpd#PeR+trWYirE z2xm9hKtbKU0UP9;VJ2y5J7QR*9gasDQaCAPPka(_`sN%dV+deHco(t$ND_xVGvag@ zHZ=k)=<=80yDyqCb5l?gS4ee4A@RtVn-I@5KB2>dgHUeBIDM9}th##}g6}ytgH1ry z43Y^C6+Q%|5m3#lU40Q%mc{~OXoo?0ome1|i$UUCICpFm$I_T1bY<)STez%lW1r5c zTQ>-&sWC#f#fZtC&#AixHGPEKa+Br5r0@HEF&u47`E)<_E0!x@y*$4 zz6q2c7`$zGHj-qYx&Njut=J*|z~JkKu++i+z0QjpW`~FOFAN+Q#CuVdN(KfO1_$>7 zyu9&7s?)vy)&=xPd(I0hvv$d%i30=D3lPL+Gj)pzS8?+=W(!Br$}&2zcX54QZ`Q~T z4-ewR*PrdaRT~=GyO10n-pi#(%J2^-yAi}PG&Hyn!|Zq|&IU23Fg(5HDbPqHWfYA4 zdqd)PjLbCpjhGH28el&iyK(de%Rrpf0xBpTNFMYr-Gx)ppYsIt>d@?R6#{{<+RdX zhn9c#fLgjYJZG5Uj8TsI<8*UO3!gNhejG98=O8v9nKNJ*unq5tWS|=t5my3>w-B;Q z7okYZlaq3k+ikZZjse_>B7;J6?8c4jJ6Qi!RaNHLm8%H&xc92MQ9R#VnT|q)U^Z8y zaG=KQVFLCrBDg7V1y-88$Rh2vfd2}Qk%IdIOC}jdW<~}|c`9*`P9-Dud)Wd$nXu0! z^TVz=CaPkaV*!K4pja_M$uf)|eX6cb$(0JYS__xw1=df54Gqt+{DC3?o*~! zt3p?P^bC)RIm#hNZg`v-@PTIt+L@q9;e;y&7geM-H|OYVbh1aj55m(`)M{*k^sND8 zWe<1~;TiDDH?N*hv082)85|$l>-y%{b6>t;a|H%R-=*TE+`^^e!lfKMf?0z*_$kbf z_^A{3rp8x`cykpxQG0P2;RiRO9sFmNX<5S+5?8U5eOQU&##$QoBfqFQ4_AIO_kAI zdXEv@$9sb&IWS~E6C+M4LZ7XPhfVO!IdL?RB~>xjJIBtxVO`q}`lanb06Z)}tjyBe z=N4nV*d3};G4Xy;HWsF_Q_C^}yxNUoJz;VLym0nuRYs&h1&EH4(GP zf5L^}dKpoPlGQxyrx~1O_;mIc52+g4`;gjwam~&JU6s(WYji?FfrBwgczj?{7lX=1 z8Xw_~I`G3SZ&Y88mCqBN!fbT}tb-#Vy72;Dx7N#ni8TN)9tD$HYkDF+2D{ST-3r*) zKN0>Cg-Xjo(BKQGQTCBHA&3yxCBL8xs)lY!G5uo3)|wD7BUgzFziyh8BpFQSi<8&D zpUn*Bgg{f`d32m&7b8rI9D7w|fW9E_VV5^28bq*188OA8Cx`^Jv5L@(paxeNz!_;N^ zk=QXo0P|P43uGpIB{=IaXj(gmX{?4fi9_)_iFG6RpQ2O@+-?x6*1i6NCLFlq8HxnV zCg{c=&f%&`1pCHmL;4oE$)KAgn6%h&Jct_HZB=477Pf4j;S@k!eSjyhfshuBQ+ zMn9gI14|=^I-cP0no7*AK|gjFjv%!^dz-qy!q=1%urYB@5#g0$jsOx|mk7iba~wz5 zr5Iv@-#5P^-})Al&b3;7=k#IK^&!huV2_0+n3ILdiG8Hs}ecWi0uZ^evs)p~EwQM|A> zmv2osxxEE`#;YPFNd@IQM1oYnYByj-5z#q1$rTvp+FNU7?9{_*yK;r)@n?fD!m3_X z%;D-zINPo26_y{xjn7c*DA=X@9Rztz315c03RHI?0uZu-sZvr0t_G6=jy@~swAWTY ziMu(!IP-^58MWBEi@SrB5f9_*#$^fjPbr>(z3x)1D-JE%JvAbRA+fCZP!!DD@@>LR zkTleO9G+hh%kFcShrDf0JFY+wePKdGtzsRL-I49++Ezro z)y4w3n^n?aQO@Srz0pyFtCt}IuGZ@H56jir?W#d=K3VuJ5rRkv$t5_DmK#JgCEW6{ECDhE*k>MZZEfSSgb)S(0BkvAUJXm2 z`)M`QIsvSl#r+i+1rF<^J}9<_Pp4O1o#}?F<3p|1K`SycB3b!duvDR35$D0z&*uqc zEnb}p4Cv5or6Fl|V3pAI4RDXiLJ4gMZS5MhL!7qRf65U6A)g($Sy`nmaM_o}rJF?V z|G8_5_X@4%30iA{-7BYV!vK*S`CJJunL=LNC>zf#{k1T%26z=${Lk2-U_tibpx?Ic5Q2W z_Rx)?fMqtpI$BY~MqNT}(VIJR9Y_w0MY0S8#gTm@FqhL4ZZq~qd*dWP!wJWKl&~CI zxI&2w&fJW1(`R2Cp}*NGlEutZLus(x26H2?q(*(h)qMX zQxq8o9#Nz<*)WfZ77-Kjbxj{Ms2u}~tS2ORg!tISX%y}Pgp&w})OtdOVWV*e0}yl# z3to4-9!|mz)ZxdOg|kMO1zfk+=bYbA+ZS~>IaYT@@W4f|`5I?L1@n^*nOFBltnQ4U zD>`!q7VGwRfLj5Q(!XI^UJX;aGDuwzLc1c9*TLn%Vdh{6`8sQ5iR1GW0*W|z2}i+@ zK^Du4TMEiVm;w~Q@T8L**SV9#194q7DdtNq?22Hz);6JtBLb@NzxYjB65VozcO4KW zE@E{k9T^eYXS<9TuhduFZUpjpDy>>Z{4lk=+g(?(w+$diEKxM-BMnL zgadvSli`zJy<3+v0*&E0ab2Z!HSQaP_nx|v+`~092pvb!i*rQ}J1h_^3T-t`{?<7j ztO4M2a9eQ2UqKIe;2q;iCZZQJoc(Azd{bhX?$x@U=XC2jiajr}ZtFUVT`a&1ywes5 zjt*zC{T|#uHeVU%*YiRUUkHP?t_D$e)39Us+(yY6x(E@5M2n&x$v9qW*CQlZS?>sh zo?V3)s?OI;{gOB&&<|8~e8{@KWVfQr8Py%L&-|v^b{5Wd>yi?P-Zi%sV^$47Z%H=W z{qu>SV3C<`M0`Bd-ZiXI4iW6DNmxJ4?KQYors+x-NP?U7P>u*j^6J$b^d4RnLUc77 zL&_1^Nc3Bo#_5Sb42u7t-mC%1L*h6wFObg)rzG556-x6wd5lN%)46i!r0Fu{bgun| zuILCKDIpr^2ofss;}pt|hQk(6p;X520_-4-$>R|TGo;Xr?EkE~W&rt>C+AnzKDW%tM|AMDP z@4avJ{KjsybmDpG*j}#yOz5$>mNgp%YUC;Kdscm@x;FJ zcF)@|#GZG0{OsC0JU^}151Q7f6R9wau;k|3Pq@r;B zKy1)S=@A~`i?aoX6JQ+ak*ytN^?_^p!k87OGskZx2c_eX*DxsY46B-4ty6^6@4xULO6=Ght6S}uF$o1V4?S|vSgMs}dpTEmCsg4T)!o;!bHt^WC@A?DMD zBc83bpjq`I48uA+k<;KJ3SM~E;I&(2Rgn-AKdlkOui8QEtFyM{46hh4>V13E)DJ zyn;qI70@3%xZ*Awzmh@X!zr?)1NVzf5=RJ6!mS)<-+HfS$6a{L;yBGeFy22fII++l z86W69Frneb5)^y<53l@@(7^b9lr9X8_xB>I`O>BM{NSQh2Q};h;e$QF(AhWx91(+OrGwk%-vS337CXgOZa)1Ad1px~g(0ap zfX^V5gi@JT5StF2M`%VXvUiY73*R9U6U6kQo`8id{fw3-!yC&;z=TnT`v6TaSs7D~ zGi>}Y4RKd5PD#FG@Dbfi^cnY3=oH;rMQFqr&rU@5L>D) z=fG~1qC1UwY5!^NGSh$pd%Ml3g zt6 z5HFZQU~d(C5DZxMg=$71*LWFrb%m>*NLAxfQuVS+N9`Z7enEis55=qv#;+Jf&e7#2 zot_ZkQFLdOv??x!ui&kE#>8#5X^rj&;$j!iJ&Jo>$>3xWtCPi0WXS(vB@d;IPV413 z;irbwrfAQe`H*MZDe4gYxss0t%lzO*W*w!5alM@84Y5%4yLwVmJ}36zuX%QW&s5c^ z>LP5dlv9~=h7B3GB1u+^8w*H|^~$-iVptK8td$aLkn}uPZxjX!jaB5BB73$E!P-6` zm_xwq!yoqCGKqeKb+C9I8v?9@0dFP9;&*7E8j2e%D|?9W4k5%c<|J*SZ@Qf9y$$5y z)79#+ko|<2AMqetZ|REb0vT@XSd4=N%^|~g?9|xdbLYLsPMtsPrQuOs9C$bc21wHh z2v6d*Y6YLy?+afw?&b&sZ=wIHW^o?rpn_{pavcjpiu%>HIFG|zxGb)^UM$9s@uLiT zhGcMx8_;g1!>f+N&q;1ByDk7uOROoC3$H1KJNXcKhF5D~;$qpSKkC_D2?WB2K$n~> z4^@-pA%`r1)ac5mdG8uIapCZo*B2f!?y=!DV#7=L^8hZ+sZ|?jf;t?a1x94w73ZEW zx2eglC*Di}N-M#KyIiXS3omqE58i^yV4gh)L=O0RbRXt@tDB+FBK*EUS+~|)@vpsT zoiAAj>lTd0YV!(BIF!O%;JCs|swhp`)`vJbMtfd`ZVzeU^Zr9HUf=UEPq2c>SK*Q- zQm(#jDa31zYj<3-u8z?51`+-6%Jv=!*5~Yzvoq3vZ&t)H*I^`QQpuxFOg)DiG!!Rn z(hutNEbsMI&_j$4w*itHTLRtUq0S6!ERj>GKsSitECFHA7*+`Wh&i64|J%4afiwRJ z;E}44Sij)xr#!^sA~mje9nKcYb0WVx7SP=d$C_M>+;W=dIjAfoCVU2tm?-yA zJ~u|G_#=0YojwJ36{XgnOwRdp$TH0Nr(l_D);o)OHBIM*8$OhSw+EpZp|kL)uEP6A zYBMCBdu`1B9GLcb|2a?cFSqSI|k`z@%acOvn z&j>TYu1(?=)~hiofrUtk>{2UN#lpL5l}t$y#A}8G*Tn@=upB;L@sg%n{feUbFmtzt z!}>n$X|IrZ4;es<=^4U7op&-$neHZ|NOd>d6DU(xC?59dC_*50)!M}_^f^0H%YCr3 zElH$*m zD`ZHoN6uch{U1DA+1vkfqlYJ@#eEl1Js~RMCgy61dMPhD(Lf@jS4cE02@^LR!7yvOdeJ%@=rj&0<7O98_h6qF!Oim^$xTG?|6CV-*_)$v( z4fIf01wA7hCEx5O6_rbg|iLcZ^5<(Ev%@>fr+bnMiej zQ*($Mz`j5>&@()A2po?3I}grCW26K@%1jYno+^TrWo)?2sY0Ymt%isCsGs3WMckYO z+1Jp${{)dbj!CKa5rn-TnJgd0VI=$3vS;1>DyMk7rREm7OTx7T-6A0yT}P&5aukII z6n3c`w#SVeO;ye;QmwO(dOC+Al+JaX+fhDH@ z9#JBcTEt&qGqLSXt1+oYoFJXZqNqc-U9niv&(j}0Vd_Ow&toq7T-2}t7S5YPb5Z;k zOg>>6C&%*$`7WBqA)FDppQOv8NS>ymi2xf|b4HOUoHFY`_;!hA@;YAdHR|9xaY`TuXkuvL}NmW)4PJk)nOnVgJ)3&i*l(wGe5q*sUO{DHmjInMx1q^X|f zdGQI)ZdQ51vx|M~3D3>!%k-b`J>dzm&d+=H+&t9B+gyb67dJkqs1weoOL+2nSs}97 zUx!Z4d;x~jL2*fdCPAOK8#>7IWR~pTbl7VDKt2ehpvo8R0=Ey`F2o^ZS)^wWMMHgj zbUuQZ2(b$i8pTo*7#m*DTzYn4_%*9?`9d{+;|m^b&|Ooup~dy+>S1E}hs_}%ub^4{ z03Kds+n@AwHk=$kjEl-odODDCo!3PS7S|b%&Vvl~2la5^xWxlXeCO4s0qghR%xhU+ZS23q>|KPm;B6%&? z*dKZZkF2iFNL`rp8T(9(7$vzn#Ic3YPfA>!xg2FL|Dgxp@gsLpwMNslv8CPhJppiO zih~vjQ!D?vxqW9D{2fY+o%?;@@aqsKE#QxwMC_)&+OoBR>ojzJM;|SqJX!iRJpyPgF{JN|1Xf&^O}(!FHGneBr;kv_17`i z#~kQf0iSoMSVge+uOYt)r9q<{nRLP=^2p#u3+_}yUfJBf=2Hy?K-{hbJFE6}uQlJQ zdZ0^2uPu*R-5*b^O|de#Ho! z_2=MB7|;<3a)lcQBX+CI%66n4x|>#b+mvxFFrs(idmwT2rqAJ14F1$mCX(q*QJNra zegvK4A^}YXUzk98^Q=WjfdG_Fn);}b9ZyY!N9oH49Dei!#q1z$lQA0PpNsHk_)`pQ zJ%yVI+9DkZ_=`pWx*k5{fprXB0c4Qi%h9n8LdVKT9qVAgUqmJG&4)|?b0Xz~hM&Rp zJ}5E>=w1wuLfg&h1)UZ(LkjPFIpiz(@YS}_MP7MY`ptd5X6!XB8i`YSIz`?OjnFA( z*y&Eh+fG)zN8PkTC#0Y|kd{lHECfp*Ve2N;t@!W|B?FK09~A*mJ{6$WD>W9UW*|ul zrNF7nF&^#(_d9jA#>?v7_a30R!Lf8ZO)92gm6ejv-YJ`&D}Z=L=CFbb8uzpI4x`bn z`{{Y_06p)$&1#<$&B>}D>z@a)T8#&8r53lojC_t?KCs)!_8N9 zx+>8hc!oX-HyCC8!_YNp`^ZrXh)qXEsUB_zQJv{Xk8$*#Gl$QeICko|AI8&kz;EGl zgu814RGrK(t%ut2R`d}eFb?T=cWsf2zVkUJVW5B1y-}_=Hr?yf`Y2c&z$XaCP9ovV z4(F>b_7?()934eqIwzJHL=i3~#*rgt9z0erh7K-jbopfp+&VTyGLSzRxR#rN1Xv6N z4lY`pA1~Qwzqh%kl7)3b)rwNmo3p%CQ9npVZDQQlMSz_!kj(~{0S*rH>{?Wu1T(N- zi8lCTjnEHz3js98?E!R-G+(b^{@rNlVIm#^cM!<{jNn6EYZ`zhOACBu3$SgYRgWw{ zqD+{DZJl-@W+rD#nd_0)fGj{PxvJE$0Nta~qNE8JW4HgYXP`w|RWbIqKlbdr`EnGg zR*@$|$hK=yp$gIGAQOJ5WY7Jvr}K4Ud5+qqlR`N*cAmnqNE1Y!rE5{#pshK?V%aZw z&R105h4V+`@zm;iqHvi4`=KThs@lI{aC0_b7f{9!yMj;#%5W>!IMAwk8i1&d$Qrn* zLp|yvxGre7DdV7;1_n<+@A|$QdAbO`c~Q7p&qLYB(afni>rQVk|F|(G8Bqyep3>(q70FY(87=6${eVjZvgQTDoGGIi-b`q z^7R*Hy*VUI@fK521Os{L{~9q@dWkaA-(L}>t{0T1k9V4k^ziZExx)8>5DXYFrg&1T z43d*@Zc8!pv^scSl7uysqeJDc#r`4ruEz@}HYLC#|Ce1!_#LTIh4;|og@3xH7IiHB z_XJ$>jFr>FNb6ed0w-4(_8f_Ig`=CEET0#Dg;qFy0Y1=?JMe*ymN-7}W5>!XeZegu z0wZzd7h6<=3~L@qI$qS6KBZ^fSRwt=DSn_t@ARYxu*PO0V>|TYPPXr>o=v^027}R- zxivCduc1IU(raLD@t`++(TR_{M${SgBT)c}TYmag&(0gv3=TU1G#fvWu8t_-o|q&9 z2>`N92y=5QkhBIra{@mJ8zGj#ATX%RY|axwrX}jzgr;$PP80SDIZm^D4cPlXLta6U z@d}WdAh8-2pCupsDLnHM+}Gu}K!4SJ1oTSyk6<*B+lez@A-(PTL+qu$@@!`R{#Ty1I}bzM@eLI~ zLl8N3v;!y(MFOLJ zU-#U!K1YPgY0($XvG0A|Gg2X86ZXbrZZjb-aY*PEQiM5Zcxm?5SXXcF_+-+XDkr>f zr+5!c;6#geijnNcP_+xrs^JuKj}i_X(KL(+&DOlZ3srO)B7lj0r@^IZ_ISD4N~Wc2imYEIB#!YEPQa&RWch7h>9CB6bt* z<+8hSK+!dhbQ`^s$%)=xKo3dH!hB+!r-KjDkJ~9;**ov0+mpyv$YV*{*hl}?vkiVa z3N*eH@P)mL?#g4r!#LobmyPZk7i)JypC>@q0bijEv9Q|90sfM3ApQ-{ES3d)aPF6P@jc* zw2@L4&~~ToWlpG-evmwh0DP|I9LI*7Kse_1s<7N)KbkUjc843QG`p< zfopQeszXOxTAIECjZ}6{?naqL?Uf-I3y-}T2nm9a^mfo1Y1qyowa7O+6GSKmLPoU^ zj;V1p|>P)3bj#tDtQa2gt) zSftZcp7;ih^viS*{wx0Ej5D2xQGL7sd7|ui8zTwsa!y^33n1)U0e@M;NTdiSxG7TVsI&7 zaUl^OlOp$p7fu2I2%lXfPh(Q!A8i~X{f`PL3v+&k|HOya288R%>IH4_1t>})E%K^R z;zX#;@Gw{jaYP^u&baB;DED7-1I{uR@kt|5icL@1H-gcezM(3e;yAH$M}4N?twiJ= z8gS*N0__Hi^Ix?O>@1fsW%#$zb_!1MDWIZe@ zP2cr+eTad!^OKt(I4-80>$;^#ls);+IK0~R&z?=-^?2UPp8Bq5%Pl;;=e%`V{2E&p z|Jk#-ox-j`1F|VOu*}_qVw@wD%XV4=2^D-}iswDUH`S4h4cUu{2BzAyV7< zoF7vDkz?I16F;%B7jRJ$5(v(O`4@0Y0w3|cU~+Ng{)%E~9@kWm0SNC_&0#_*Ops{8 z8c=5M0zM_nTHiDzTCjxJk4)wwWl&kvXYFaYYvR&-v`bFeDyPfu0sxk^&65A-@gjP- z*3)Z^Efxlpj3U}SiTgBM(h5L`cRVcL{u+P)-w}R$;VS>{6ooF5Bwi7m1olZMR^@aB zks0#T3ceL&Wt87;!C4(Xho(cWVVw~F1^KBTb9f3@FwNn+f@VLU0Ysw#&3>>V{G~5> zVQSohi;@L*mv&d}9mpt{E%dGle2HM#>^{Leh|1PFf6-4by3q+Dk0@Lg%P{FnD+pS5 zuU>c%j=;ra?)8O^n7AHu78r9Iw+64Gcm{ND(&t%7z(BT6(YFQBG5^aI2hrW-(wRd? z;5H$AL(sbm)vO-^+~ChuUy3x~*$lcr4T*wP?Pu9#K8Fwh88M*Y(ux?!UFx5z&>Z1k z6*sWSI>6^VP{coi1y)1%0`P}kh)-lpNp*vNl9Y1OP025E;v9DkW@ptvWsV$hKH}(K zd{mVE!y}&ccEDReIO60*m{$y5iL)2~wu!c>v7FI(Wscm?>iTJfsmm0;c4eE&l#|g<#eCfDtVDQrYsuEg zP0o3@xQ=B^xw4u&(iI9?ZE`c0AIo`mTq}zyf~aniDoeDzab&JXOazx>}3x5c92a z6Rz1NL495A{oI6@hUl};RgXRQBTq*KqUbfX1pc|EWvDWr z0gm~t{5yS#MGCxoO}*{0daLk-Bj?Y`{;=6A3-Mj{MY}Z3zsO?X8)<0-A#qU`lbYmM zRRRzzIY?;5>k4Hph0e|ma_g(*(1S(Xy6gq{9;lXU105`tDd<3EbP6Yb1x0Qqtl-t= zR-u%s_V98+Rxf;5h|{X|$(e%vitqip+uMcqM8vmh*60H!QbpwVaCbt6(~#p(<0cpGxxlV37pvfieE&+=K?$)}@(g4i z7M;V@D!)|5`&tWaswUzFv&0wKTkwB?FBOSJAY3tpS3?*JUsMNc9fYwuSp{KiaN4NB z7gCXHvrFxX*a%aFFD`U(Qa;%jQ(aVpG$fp3wH$sc?x5LHKwbcZKLn&4V?S$9cUF)? zoBxvF5rhq8l)er?n0Jgqt|Rx5B0*jcaRBQ=@R|u%O?4H_wkBy|H#EyvLvM%{K1H{H zarhHdSA1W(G|InVuW9x~0ezt&TAu(%LKVtw!&P_u70h0*IE#B@SUg5(#7ZL?FrJUlIyhrgrLN0 z&ZOxWNx1Lk=@NvsFqlLJ97*irU-&=T?k98P-{`GB3)6 zSP-V}Ptk)@2_PV&mv|s)>sozS;FPR{4Hi#f{t0(nP$vag_)2&*0UGmMYQRITh+eJm z8>Lb^U-k5wB5vKy#)}iAxW0z-YJiMfHADsp1K*E}0$d{fE{-O}%P{f_B4Mxr4IS?+ z5;TgnBMOfjeQ#dgD*~bP4;A@0uSNewgf)VW6JZTnDZKBMQ?FgWCt3rAuENfa?MM=1JUmO4V97uOc;JzK?yq6J2c@d{-S|9`l; z$Zsy2uM+5*3Qf6~05Sj;fjUuNdh3PF~JB0>rr)yq> zUx`9P$*D^tu3@OUe8UkqSb;>8TEOOkAfm#s>gC@ZuAtl^Ldqf_*<^&sP<)x(Wfrc= z+&IA!sjm3MF}5{T!{Yc?l|pp5DvhfOx!#F++1gB+>o9)0@-soR1_*fc0fkf5)&c=c z;6@ejn=+#3Qf0bwB+NtsC@?kp3YCNYj$9JkQ=zXQkZCBs5k>cPgimdiGTU&p_XX1? zo&c#A##chBOgeHt;I-U9S4FaeEUM!7PHj6#euk!c4*bhBc9A^=j7aF3gt8#qA+}k{ z%QNoWWey@9Ss`L72t@(}kV-GoAHsk6mxt&>B1R@)8Lx1c!3P(HW01>Bx9oFdoZ}qf z*0z18&V3Kps^h}jO4Xr;n|bh^ba;u}U%JaxjfU1IQ*2oCh8E!ntXSE~0y@6YjSY0L z#;G3%S>QCAFByo3?c|{*a7Gf~=ky~8)ki+ME8Hq}Hq_R3D8QckAB2g2I2XrP^j`Xe z+QlP`X4u*8b*=2}Pq((PPnzpn2C58a&NAl&XPp&)xbPK^LRhi!PpgL;7vZhB)9Gsi za@@`H)|50n&VK%Bb?;``k(72|ENFAwX|u7ajT&b+KB8`BfAEMp;D41V;InPi*No|O zw#n{HIuAeN+ z|C}>3&pf*;IY9fqzn34e_L(_z=FFKhXU?2CGxLGJnRxE)lg|`Fq2kJ0-@h}~ctth6 zaYtxQgzoF8WZkx>Hr_1eg>hl9Fue=5&`7q!IoQ8 z&%d;8yZrD&QMK{YJOA~{O*ek4Wkbm+eC?m_?7959TU4lYyXyI~b?ukGa-?|qi$8xYJ|CNG*>~lMqgz9v z!|K=0wX|RP-D9^zF8}(2gyr+!Sog-u%dfd6G^-x@_jO;nvM@5-w4vx!{=sjpTe>FO zwr`(qOL67S@#f}`>VHGawO7u(_NCSh1qb@^ndYtP;n%fny8PzO@Rjd-R`sAZjc*T3)Bc;#T_O?x-YIAy-@Kh{Mrzx-4GGc==~8eD(Zm0MKPwHu~=fXfGe z{v+z%!4Ng&@qb^xL;cflxBT(t&;Pey3rz#{4z=g?t#@Df#*=N0q1#sek&{^5h~*>L%no<)l<|KzWJC3NBPiJWlxcY+&>sqdS?l(Wvp#I|H>!`x#f9tnH zdG-8HhHg;L{aMS0FF)|{8$)@YDcu)Z@4n_h+oemI!TBp+`1p=3*G%~g=vOz~*1YTT z4S#w?HT=Q4ZR)wNg__j;Uv9ZZ{ra2NpShfTInprKuV!akc3u99-x^fQKe7J4%Z;B& zsapqI1b79&y`d{he}3~O^)so^*2^FI;zHVH4dLg@GY)lSuRzO`wkd28sGLn;<+?p8NF5n87{x-%43 zFTQ1c^UAlkh2FkPZS4(hQy)x)Dxve#dpD`pziu5-&potm+sga8LemZEFVmr|>Qm$E zyVZ}U*Aq#Z-q6FU{pRLFs;#_kvwG?c>wjJy9u7q>zxbQ$S1z4d-yB-`?7`4vi~8m` z!Bb1s9sdGyzx|0&c;&JF(1noN^^qO;9ti!Fx-bg#|CA23sDVca{B47wdp90Je^iPm z&z{d^EA6+dCl*83ugndG9&b=BuW!|T^5P%1zGvmBJ3~Jf3QegkZ(QG}%ES0Lq(1#Z zb9|-aNa(&M^?TDS$e(_)rCU9>0kuDSJalVA=vMXE*PFk8rSj^~zpYb|vC!6)?;8!> z6$+hOfl!@jQJ=UF+WM0py+(bi9sGEBeM@9zWGs{pg(g=Zxxc$XUGv+_REa7Z0IM}tM|QE8uZwC zQ2V+?jJ|jMAae$sRqBN=?f~Og4m=u~4XHo*Fhb@`Isg8r1J>TX+A;pZrMZOO0yN zPqy-)dE$>-_NdMfhBm0px3q4${LO(4>Px3vHmeIKT6V0Y-yHgZW~JV|e$UEZ z{bcBq8&%}t)~#yOXIh8VH{Tojw@`*h{mPC1cj%h+YEOtqJoUoM?_Ix3J@(f1H>`Z$ z2SU$;)T52-Hm#r+j)&C5(~$3UcVoR=+mBew%u@Av~bskFAfYn|=-% zUw=CElxn(}pG`Pol|Zf{b%Kis-)*67NiFNJo7)X6VHLV8wy>dT>cNTvU_m53!p zvhtTNhhA({PyQ{iK(9UDqV9S3`mO4C>$*KFANoeh6mKMf6{v0$}j9~xUxS9h z3_bFy>l-5KZ*On-*HACS)9!kCu7C4=i_bZbh@nrzo0@oXhy})w!KIz%uP?z_ue~8 zrOaX~U*^ADX651OhJ)KeMfJJI8e-}<9&2cm->*ltw?E#nb36XN=4}mklL_)Os-a~| zsC(r-ztHf}heE|)KGXPT4S;@r&#qQ=va#`L^LuAgZwJHo88Tg!%o8b zmG5tEoT8!t*}C$rb&b1Qfd2Z8jqOeNJ9J&+*XVE0&c=yQOEH$4j`yp~Y(uNM(%N`0 zGD5o=-vD~JwCZ16w^8+WHtkz^-}Q~%H}7Hi)I_F|iCxT>^Jk}X!^P>jnL>H2y}hWu zo^JfVQ1VmprakH%uWk&3#f={(T$lg2X|H@{m#ax?f~L9{8i(DhIK%55v@@##G7`l zeCV$m{}(m=m%e~*#oyC^+xQh?6F_&U%-=Ce`n~e8ziYfE1%MZ~Heog?u58`jbjt<+ zGKWz?vl?q_`W++YE)qnj z_P!SMqwLshQ}4>|*Ejt%C|UW)>82;Q;x7{WyYN@NyXpSx@%M|r+O&N=fWP&8Q)@FL zRxkWu<8C$m&W3B$nHQTjsEyAxb*b-rvFX~CAN{SSC(%(W-G9_{mRJB0Y}};_d7o*z zNu7Mx&h6@}?`>*UH&sw__A6k?OD{M5;k5vM_J22RC#vxGj+N`a+4LXuvFY1Qw*diB z{pxQw9i|q)v9Wm{z(3H~OyDceH#L_D^46B-Z_}T3%_s23TSq_&nY-2V>zZ@;O(RqF zt#6J}`kr0atNHcKJ52h%hUS|ZNuqg(e{OvaA++h;N!p-gGHwOAT_4aTx zgjt|J73O-m|m{T{sF}%CAjT0ZtmCE^Ip{*y?dt0g-U=el48#iuKZ+K&PQ{(=&w#!>SzD@n< z#dUkHW$?Q)<=jMDvB1gCy)oS0NF_pBuGu?|virLt(YbQ2tz0SPvz2InY;vxUtpI(j zJ-*bQnk=L$8EBWI3$w*iC2cc{vjkI)FHPqvZ4<@p5on_REK=~5o6O8jSIX*3e;-aY zRZ4R?wfi5!iT#tA>2fZaD`zvaxjy~DSdZr?CUS-0-1Kx=($%?t2)DNg$jV#(AslK@ zPrMX9Cb<6mrSL>E=dBF=V;FY8k9;Y-Bnhhd%i*#>J^JPF&vy!jN(rmSeBsH7^Sb8^$^%2dA0NRAZe3)98S#LkX?PT!XS&8BE6Q#j{;ot-Y8)pc-poZ?=eMk5OqTO>P` z%U+<4dXVNEaJ90SW+wNyr*aDwngNKFNh1PDBPRX%$(UzSQ#6@l5|1uSmlvY(C7V7| zE~X~))0*jNn@;fkfvj(7OGdWsT%{(?3|qc)>D_hE3X4ZhsfRzidDj`YF{R4%D!7^9lpQ30 zLHxpPpFiT?U*~QqIk0N|{QrWQ9S! z`y1h#ckAp)o=8qqax-Ng;CH?ezR9x%<5kTr<<3EuN8fPzba{U@OE@o)W`Z2lW8LH9 z^{^yBZwjOaS;a`aI#_yE#d7*|Z(S^Pko2yBq`be~pz$hYvO;sr++3-UF68FhMsnw1 zaa8pzlbej5i^h4PnoK(lPvvRiJ2@Gn-i;@Es#=OUJUew}B0ZUiO%C=9_4IYe`*nG* z!kywHfHrQW^Sg5uS^M$q z&g;lJ(^0V?Gdf#bcjeCI3p4^@&uwB8$e;7nGyf~Rt9Gu=mM=yxU9$3Hrtr!t$qN-s z>|_j~oNI-^M7f8@CTtYn0C5Z#8B89Ejlv==obydi%<9ug1DQng+18O-U?s!kBvS`X zCqSq+vYLzrfPiH*K8(_GPJT0F9hCjBmB^9>5f5gj=W=PMxZnjRe2m~D6j`*-PfAsa zx`uc_LAhLuFOll9SlaTaF;mFG%h7fu<5hBTKM&~cDP}X%hU|F1Zf_|!JDthq?wp>E z8CsLk)0Jp4+7^v3=U{KIRSD|Qcx<-<%h3YXnO=FWluN8ZL87JzmFVXxHPUJ;+mcw1 zd?{lMM=xb4A+$C*kXoMvX1HLpqspaq)Tn71pqDOnjh!x?F0_qzol8|{Z7n6^-m08o z#t2k>0+yGTwbM$Vmh}XHF*=Rq#;_g_b|uvgkuH-EmUEO}EG02{c|3b@Rw|dtPWh{{ z_>yndA1juQB9o1AIDjDbFE2_ae0>MnA(Fs)}g#i-2 zVs<5Zh(xciKC_qO{hIFf6vp)o)(KQaT$=cD zX >0n^;+0w!e1PNb#mvf)7@0Wx&wxO`ad2gE(BmJ(_1r;WCwV(sL2`pY+k_uOS$ zR-t9ssP3+KGFq8RRwkmvc0q!<1=CSr1;uFMD)Zyv>pcsnEA#8BSB!cz?vH>9Io#a3 zCz6#Zw{A4iwTUW|#bU+4Gs8R>MnPc|;;{6>`Yp-@qH%ncFdpbHQvIg8=&0${)%(on zu5d{y&Q)gTD))ND310n`S-(dy(%8kTJ1s!GE};vYg(Kt8L0dpRbA>FjNw=^(tx?LiKVvb1`?S$cQuv zepk^_mgeL{G!^xA1&tW+ZOxiq^X>5N`cv?}eYPu5-vi~`T_^7qP2c9S+6>F`Bh#3N zjr<4ZT$-FK6U4N1^u&FmM@LSzow)DR$u>i313Wm-e>=Qwx2=#JLEIpd!~kBjEf(!} zToceCq{)tBkc>dBiFC#L+haaVyhf|7rpuhcb%IR1q>n@o|MAt-7@HqrCBaaxo%LCl znMDMMrl!@*89$YYZ0{X}F46#Lch1#i{Mp`iK8kG%2fwTc5Xvq6!uy0>3{Z(J30;c| zyX~jG9a-;b*G?j#3#N@8EjzoYwu zYhy>1sz<)IdFvaP_BGVyTH03ViuXI(Pm-*}s}D3pQXcEpHPqAjae4<*C@JnumrZfjezZ z%~A;m2f_Hk&W1H(fRq_<;B`RL4SWl`wl zrWlgRpC!^x)o@4Y{&%Z|_2~|8QgSqe&XBqZ3`Ht5nk|Z(dSaP>^vMD z8tmvt614UJ+eO5N!2#Y_Ef4-znnRvlY^*XAS5r-zS|)KYnpjmYC87ge8VJ1^5LiN? zdRrn}JrZ4H4HxGMm2}T{WJ-u7p^Y2wDo=`}Ro!oKos5Es>q~#Fw};ItIYPw)_N4j)Y-m zq9Z!kp{)t(38X`uY;GcGAOMX@uZuW~h2Ze18gT&sPR5!u)KD@o$nb547nX?X{_T;T zt4{Z_XXh+osW9 z`Lgzh#M;%Tqmk=ROSyI)rRjF|kcb1hTqaD~X-F$3xZbShBGLjIDdaBI?DSipUf2-X zwK=XanZoMJ8zQZqp;XUS3Ai)JJw}@Os+EmZ6&{D^xO;OAzN6Z#@iyhU$r_^l>Hf49>%I@qlRgEw4ush>Z8{{BrGgjHtn(Kz(oFHTh|~Q z473D}Nx?X8@x64cOYKv2HmRi@;;@KTO3Aj$lp4GiJ<(rp-?|-eP9jdE6#G6bw7wBHCjM5W&B=EhkCweux528wZ9_83Hb?l*4cWYEm|5u z^g&Z#J#)$vD~w^-F%caV*AEHX`Pab2ci5oN%hZ z`?XTv{kc*WaSBqFuu7)J@?Z`z21J{r_6Jb*^R{pz-O*Mq_l;6>P8>-`XS0=_XveY% zFQCzqb|}3gFW#j?oBlwfuU-_;+RuA`lTtfdenu5 ztMp+DYB9Jshfqffz@dqmST7|APe4ja1I5&1ED4O#I&BJI^}m4%`m90(lnpUFO(^9Tt$+dR9m3LZAY^ zLtDVEK&38hmW$>kORme;z1Cz98Ph=iIy%c1E0(@OJA1iLW)b7+A;>k0cqqLp&SR%O zN&m2A*lz|*A>EzKrh%2G1U+B$7Y4HZg+u~-6DVMF#|q>976Swirt%nl*H87v(>^e7 zUSgZtreH@KVrD-v6ZTT?F%@HeBcu&d%eYU-Dgc4a7v*h?wCwMZ9aNuIj15~)!9iJ2 zk8F(Wm~>mk)=mAY(uHN=_i!nfp^!U>Xf7S2t$z9iW1x6q^rTD+F;Sar2_7kC$+u1m zul>NXBJD@<12sOBryYn>#o5;mb`NwpUyQ^BcwGSC zb-I=pw?tBm^IKaY`{AVosYfZ;?IFYyoh=qG2-pD6VrBm5Xlqkrf4eQF8M9?;mnOGZU$<+t5|}=t*qP8hW`y5D;6s5_lW|`>wK}~rpaW8r5XY&-1PfP#frpK+SGwA zrpJ&Y)NN(uh>4a}DDtQWL0yOLn|ftT5uTfMk<(ivacPTN4fx{ozz*H>nCs3D`1(Oi zpZ@bSZe3x+Brrf6Wk{-2RtX&mI}Xl|>zQCAe{QO>^;Gem+$4ezpyllf;N`86UEQ{> zvGW-7PM{JkE)WY>U9Wn}w#c39xM|S=)q{|!E|v_)ilOJE#N84%*%)dIQcf6-dE}UY zy(wdd^`kA%1?y%T0SXX$wbi7p#Vz%^Dz{IK4=1>;v^c64m^Q<%G}XP^BM1LemYEWH zDmsa~NlbjZ%$(OlD*f7fMqitntKj@;ia2zpkXt_w4aK{{U)UbmU9;YV-BCd7NY#2% z60zMvadSLdohpt}2%x(jH6elD`;v5P+&0Q?F!8E1Y17Mk@>*kEs=C`E+j)}gPx8mzw>wFpf;ydE``n{6@!C96{Nl`D&tV87%2 z)%`68Th1^<%t%EN5gUFPSj4(}&ywXOA~RpYWbGH=bxdFMY`%~wEvnAFP{Br5RD~iZ zNz6t^Pw8Ow;Glr;&`>6jQ$=>T-ZeKl3Gc@|SM9_J)Zct|94=~UZ{)Zaec;qFcr%mH zX!2_QQSsi?i2;L1*9#2;vnJ}LLycMok9Y4V)D+vemL0r2!-8wg`i69NUzDrS9l+R* zE>zM!T8n6i!p#w6O4VEN4XAw--hr7+x&x(l#2u|B`m{3EV=M4amsqQgtK z+GqoRp-#>a^5od9ElPl=K;jN*bzPZaGlYc2U*{oO$DJ&B^p`o(-Dt$6>?R361U|82 z)aN@Qv0YRjBiG`Ky8Y}9kNic5|J5L7!ICYP83^%(LFcB_DdCfqso^pr0c?F^R)|O> z1#-+_LRc@vOp34|%g;M3Ij^)dc~zqDjZ@|Lt?s-9t9Ji8S~_<&gQ&1J{r@WEyIq7Ibp z1#~?iAhiBD9|(MK>p{_xk{bxf_>rS=DQ5(lAX*1W9iXYKet1MWRge@1s-SwcXba8i zJspvoZfCp*ak;um`hQU)Nn^h=ZDjarSOvz64zN~zCECbx2c4mRTWw_W>S-fkCA5*2 zgL>M?z?jZ+6uz%gMH^97&_;Ij4tNMF<*pSZb##-){$He<^jfCEaeP|ejfm3GKJ4#Y zH@SmB#u&I}H`XdL?xdwlJ^C|U6HBf$D6mbC=)dBW_gP4KOCZQwQh~Q8pzgjqZHFe< z-kivn5reI?T>7`!PO(=z?}tQ28TLK=X3-9Opfv$1i@tL zfM#)t0X2KW=J!Viwz8Qjwriq;+yI5L`ogBj&EXEh#Bl$#KXRvUVJABJ+p<#>M^{OU z)sGMc4N6L$!c3so(Ku@XlM)g$oUK(t3dqw72eNxRJIC^qZRaYvHkb%)w~wQwgA3&7 zgdr(2u+SHDRRzKQOkP$|1chnDQwiE-adERl#)m)%rC7u+P}f2YR1`GO;)!c8eiT~| zabThEi1g;&rTher4Cmk%V}`VvuHwN zveL$KU443T%XTm7ue`|}VJf?-Ut+d^6M;+A+TLuYa519;&LIidR+!2a{IfHXZ8li* zGmwe2q+$PokGwoEau1w)VvU|%tmp$*X&mc38)JB9%cQp#@d_H0oiKcI(RIrB7|ha6 z!{-YXhT{?s;Op?6*ni3_#?CS#oF577&(`4S&%tz1w5De`KT(kECtsN2AyO0d5JZVSuerXeF2LFU4FLr1> z;2tI8lVr3yDS3LAwwsP(&?0HIby#Vw*k~6$kjTnQ_EJ_`U{UQb=RE|;F>^`4^rA=m zOahA)o#vk3G^^*D01IIXHKwk4N~m61pKJC(Ql$-c$?TW@d1wTI%k6HIXWM$Rhzy(oacd}GZ4FiiWxbpM4id8X3_mP zCmwJ`cq0%K6H$QSBn9gdMO{XR+oH7&z(A~&tEsO_+4WO;yMajy=pFS_2P1oLsA>3+ zpQ4^S7}>U2>cAGk#9|-)qyF+>q^BjHEI{F_&9_F{9+2ON#*tHX-OI_Tdtk{97pIG* zKI2e`RYBzk2!Y)6lM;C%UJY3r@X1>vH>%6GMy~Ts7$m)_>put2A@%5?$kyAzbkQb6 z45=|h=W>E=je)qO7fQT4K;A+1nM0B5t_^ba%ZDPnZnA!mWj!9W>cO;dFQx^$e`BW_ zzAdt4Gp#x;G$s-C&~1^oG|>=JZ@(Qo=Z%LWTQ~7a$e%IP?!%GmHwLE)b?4#84~1o@ zo5Fj}oh=u-yQgPUl?o=PYApYDII^c2OWW;{g&>wgHMRfA?UB8Eg0&}g!%~ybw&kR{ zt}pVlrZ%yGbNXd_Zz4z1#RT+pWqD)r|Dnqi)@c-lVyp*?)6E?>Y4l6 z{z&|=-d>7p6$rlAYR{KZQz|o8De`(3eXE22XyQ#K;J!8Lj~>JJ4rS=rwk@8bGW4MVqT0 z9*A7OgB_1Ky`J^AU>_fdwDnYZ7E{6xX*8`qtlPy9sa_mFFgazN&6O*YxQa#JuW$iA zPRx|X(>XH_gG9owtB6=9mPURJTsOf{wX<*~ErSvB9203c800a~ftR=)B6Bd> zSGv&8P{(jNng(-3Hw~NuI}gwz?@5?$O+lK>#!|&3s{*jz0uJ{pJJ7vgZV?_Q>_lw!fdts}_#>(=9@Ss&lL7 z1rdC#Wh*)L#qE)8H8CI$vb}AN$GA70pc2~!-|+^mdgo9i@!jmr`ep=~t3g9ekI#;+ZBAO;Va6x7Sx zBb#b^e4N)f#pzeG@(?=)D$-vT{(sZ)VA~q|@0MFBF}8U9=_hIq86DtZ)~fI=BdZP< zeaTR8)CUKnTtj4J%jziq{G>KqX_$(-G}==A&_HD83Ep1UYvD}AOnX7=W@*{t)vCtY z7XBSu3Nz#lUfMRd-(pM2d`pqQLA=!v)wSq(I_{uig9cYw(dC(bRaVs;Z1Zu7l{Imk zmvh5dnUdP^mFJR$R5N#ha$4u{;Y*(3^h|H7Fg-dp0S|%x;LBbipw$6fdTxdc_$01b zp7g7yYecD32@Z*B9myJSikHN|#mjy+Z%6@gffTQ0SXJwdOFIWmc z>5^^WKCDw*D7hGhTMM~Ol``|(bTvI3Y26+#P4SV9R3PiE!;w8(>X*1)j%uw|?1m#| zP+&~BbWo@0cnPZOIFr~_np$2JlegbC$;Cu`DNPO5#m9btnp)DR#RZ?rOy|!P;JVaf zM6c_3!x}_OZaVEn^MxtI_f}w}&>0$d68hFGBVEeghjQxTnw3bd)5X;HT+){ok1pKY zx6kIJS2CST)t6K) zsN_X`Ws(}e`JW=JCG;>)Ji7V+Ir18y(~2wxs-9weiJgF2_pUxcrU=dlTSIQC0kh7` zeAQ_$mTl%D>hs4VH&L({X{k$>1W#R|VBLmFXg*+X7I|{Dk%O=XxTAA-!t=oa1gD@j z#I~hDLM|{A)W?Q(5%!Ge@$B)DDpSVAT%{wqN$O7;`F?xJf*~$o0(OB+ zGi@-KhQd|=U%-ug2Z>>tmooXrQLarnS*vqEr#33OG(s}fbP{n|00(`BxvTtm{p7U3 zzyk7&X%TQ5FprtJfl9^Plj&k{6wX2+kLJPqi{;c}KlM6|1TmR)!(}v7alzmWS8hz=2*HUhO%QOy4;rLi~IsqemJmhfA(8j zSHm;wOFoC#TrybCn$;>v(YX zfb@=J@Zus`RAVh&uZ}UJRL9ravb_2oa{hv!+f5;)qN0YHa#;4C#2GGxQ)CzC?3b@1vj3;pKFt{sYM#|Fj`FJ1i5NScNk=Jy$O<7&qCSp zwk^Xs>p3G6W4cgh&-fS@0%tg!90j1`sO-Ld#j{&|4uMuESY%htxJaox-8xDO9H$p? z0<6>ZJC>?}k}d4P?xD_}K1=2Da?q29g9%`&h&KN~X>zBHAkp|Vs{CcHyA0zAN5fF? z2<_YRVKXhc`&-|Spww72HK82&;+$Ac4Ad+oN1}6BdW|WFoq47G3IYU;31A zv#ULDvMUml?tT00T`l?+JdfVb@xA6LDdoFzonhnG=Nkw?^p4{8L9|_q*}tCRqANZ~ z!>@`+=dX>0`gK(dl<60rfZ{;JvuO-G2jHGFwD84q81@^MO|R3*pWu!Q3!O17iA(3`?H zcvUyJTb|Y7HLc$Zm86NdGu+mIi zNdN6KW;MPCG!TU<(Nh#;OpT}AmcYEA+v@NFO-XgUIlR#$D++>dFFnC0-LFKku-w1Z z1J;SE(DsYinxHqw3w&iAZO5aGD7oSnM{bZl-3b9*8Sk3Arov3JmsUZ zRM)re0U_bNbcqoU<;$m>VQO#Y1C?oVY{dIaO)$e^(Y}j$e#=t7@WL`8yX5*{M%sX@ z``!}X>ya2peW0A`2>?^O3&lc?&Y0HC%uLT`7U{M@gB8+dei8#^VBCjjG}uFRxO`h> z4K~+S86^HJ`Q#bvYUI5#+SjTl{g!aARc5t-4ue2RRX-ZnW^FODX$R5%K~fC&%nuX8aULizb_KLTo(pQjuV;>{XZSnjflG|VJ+`tiOGy)nqjfmWmx zM|jGEZ3Bwke&uu|2X;=WK>ZPe{&6#_keM=Zp@8?T-FqHSP(TTlUu7I=>^8Rwy-nY@ zPd)M0@J+lYvB7B#Yrl=bF|Pjlt>Ha2K%PUQnchuTbVXj`fWc$S!M2Nw3 z`+ry>HqRAc*-ymUiE;|AmS|zPQ@lDa_Sg<{v>O$K7Z>7T%>e9V0;yD>YbR$1KyWFu z+&oN+A68S=?n$|&uvGKXorvhJEzs!`S+_!3+8JiEhD&eRdI|ls15s8w(* zcS+`79v~bG>OPtp$-SEQp+BiNR$gkZdh3hr1@d;5$MN9mYg7 znAmARP8IPV$a;b^(Q=as7ST^9GfVL@bfu+)J^4;mX|xB|7ri-ZJ&1;%gPfc)cUp3X z_?J?acn6Ie7r52ZwAhE#7h7i0=&X}!F15s?Qn=L;Kt3bkjy0U3pN@Fr3QYAeCk?=vva3iW|mLnzprKqdPk1IZwU2BR7M8&S1&X+xBhvljpEHt;( z_|59MWzci#a1`FBlxP`%sJ;2MRGVWWP=}_DH16 zHlkFYDV>-(XEv+4%uW>R43O{;MYcN#O!{#Skdh3&5hdtm7kaTT@1=SV9lZ7Mf&I7j zcJ^Q5Xfp`h;Ti|hLL6qPnR6Q3y_w2XY9=q&r)VmZh9b-vh8(lAW=mSKWjBx< zd|b((Q-`!9SOxP0HSk}qKvQBW-EZnd4Ggqw685LLr9_mJu?bil%y>F+z~Ofs?U(Ir zVOXav8t>}GJwuC2z6`)0mC8&=c&jyiGE-s8CDH~wDCUrI=ZplFz}hVsFzD7ii%MiOfQP7V>S{a928&(gII_Nmu=-l@ zAdc!osW<_g*5^|n7*Y4C@YYbj%BXM$U1e@CM(MR|9O5x+b?rYu%mANmwx=-M^Ukw4 zm&)BE0!|p{;({ua{G`sEF^fMb|*b}8SOVckidEEq@P#Yu0AITPCj2P)&z9~V>(FWCn zCqv)Z+mczO%d&El6-v?008PjwLfJC!dNLXmV==E*NLsXCE9q9yVIr`{1RSNRap*~6pOt73uFeTMU zp@&3Oa23o<29a0=TNrz=9Qwg`J+9TGn69OxQze+t)S<9Hm|)R>(p~an1&us?mTJf*rnpQD zSGb-oTsmF4bh^-WF5YLewN%kHBVxGgD!2x1*^{-1?zS+4iC$^AVd7$EI@a5H?Bso? z&WxOV=*-BSr%s#%`}dPHs`tD-yra#Q?ZjcT17@Ai%SiT8sJ1`dyyJBcO4_41!8U`$ zerQKx+1~-HUI_-ro%9mYWLs8CDQ&vOW15MWFAxdi-1>|q#;N>Fj_*??#@NW1bvH`H ziF-21HE7hM?+CYhj1SjkjCUleiXsP+a^7rHA! zT(U5M=T#-i>-Ha~n1E{(Px_hSVjnP=Wdmk`*263=1Oqb<7=;cQp+`S+QF(} z6FG#Xr4Qfl5mVi4E$C#vS-KMmm*#%wbY-wCoUg0h@L_54@AsfBg$F#`?}45~Rb6~- z2#qdWW#ra}t9^(sw1r0l#P4vvtm6cgg|)UCv1l7YricQ>yXO|gVu#`L3HjY38Wp5`c2)Ms;%&1(8*!|Q4Pgl5ES zWx?>5odq~OfcVvDFJ3F_*Y~OzN;S<2Cm+hqnrWX>hKlXx9K$cJ#5iYi5V z9Xmr8wYVM05wWZEB(sB12r>vR#uPaH3YS;3&?U1WPbW*+wr=IH1IAX46CxAoq@H?L zc&C?-$Ngbr^X!6b+7|l6m&YWty-|b$0F~?SwY7K}~JP#Ha&4@s*;x6Z4pWM)PN344#WK zWNkVVcvf73$vpk_u$3lpqbMTQMTLxCl+70~jS<@r&yG)`h-Q4u68xUBG;12Mzo>9@ zHj{cv4Z>$`=!f>r^euh*@3^_q(!;HmZ$O@vNlKcV$7X>1RcIqdH zGWfUvo}!bRM{ZtnQS2-<;JHqby#)ji7(z&{)t0{xZ`(*5@l_!acmo-5 zaxDW(vR;E0FXl>>~<~40Y*IvQVU2)%vYuHx>VGzH9Y8+%5*f9 z++6ICH zbRj@oFp7|*KUPjIBo`$P7Rr|f2goYVot4F4tS3p|I(~AwiW0iGV3Z$1!$lbC#=j4* ztHbc!H!fdYYCLw$lV+*v4_f=!kcuTemMukB?Ty+7bvq5hrle+WSmH3(kel7!vRvt4 zgD{zWsK905LIRg*7)d5u*pYQ|w`uKUofb~E3%-8Nu7Lk zl-txxPlh+VHb4&TTH+Be7zP%PU!hf~uaxNR>e2Uwx8hcDqfTFW!CyzgTM(vG&S80% zd*IY?tjvojI}yMUlH-eg)Z>qD-YVAz`qv6@?kqyGa-~9wg8q5`h_(;ee#C`ASsWZU zuP6tga|^jFDkD8FVB+`C9VCJ%SQgU>hQL*+s2{Omh#DoTIPr`ee^?yAuJq#I;qKdS zH)jJ~6fsJIuu<;`Qn(@;dhjD2y#8XYlOa z1g*q)EjAe|@@*^dv%D^sDaB|DaS`V=DDhrQ|5KcTGCGZs5YU9KDAs0P{EAUtiaIP< zi9YPeUa5oJvGUYZ430axvyuO#`CnKXxBv((ibkR5OfRXiUktak#RblheNM2;4Tjo* zYeu;Pqp1LfGam}?x;h4eQeXYWaIWCG6TR!Q=Q`nMB zM@bFJ9FHWBC5}0fX^vii6N#Y3R3U#5q$eYR4XKj){r87&Y-Tw1rT2%E*YjPl1c95E z%ub$!BT@d%>K>fD+vEdDNyHPj(mC+C9Av^&kv2bu%#Q?Zd*JOCB8Sd^w0ffZO}<2C z=;v%nIJHn1@r2K37)6ikHju$&dK|uHi)9sXKd6co74dny{4ynR_^66BTF;qWvIne7 zn-cLn5_jYAQ}@E3LT~fpUUCCXH>Pt6KPjSbJL6?SzA!sybtSDnBv8d@PmRE%4lp4h zl;#G6fGSMiSm29+%orh^mIVpTNt$Zl>7feoW^nG2m|r*cRH(<`t8;8)i?N*BNuJg^ zIMv60DSR^)H|&VzYYBjeWN;NsV!T_f;JW3rcmPBC-S1)38iHdz=pGF63mdR8snFUo zq9bsL6|VWNU;@m{a?~RP#5w{Hx1>3Sowi|2S8(P`PE~k2Cu+kv5U`|v;e+9}O(@Fa z8wo5DFMKe3(_KjHj@MEnM3cOlD#%lmA?C?2oGRrerAO2aPsuW1b;&-CQC-41fG0Wc2 z^inUS!VQU3nXr5)J)+qI0137VOYM6)eCWaG-#q>v^2M@sKnLaY+p+xqHc`U91l*t{ zjVNOyhA_#*rIkO)sWXm&MZNuL#9rr<7sX#qPtpJecaFEQ61N>^c;7|D%G*<{wC8Sg7}Unmotgzd+9y z;8UQ0mKqf0=N;X$(w~UE+X_CT9^=Ekv=EAlZ;G4Ng)g6Sm~w z_C*Ow)kP&$@0-xHV;ZGkE8Vc(eqH)dc#r=@_SyziVzXyI9FBT;dfIv4TUW3aZ7kxG zrA#&rdoUq|^-5g720qY@2X)~qFmjTTu|#F`5*?iBiPQJk6r4-eDK%5X9u1}9NPw*6 z2M-Jd6K*-sheg9`{P78hc9QuJcOD8wYulr!!6Fpz0p7hrV%$8+P*%j1om|$`tN{V0 z{_?}&HlL#edUL!_!=W<%)nkYsvYbXo?Di5mmvBS*@l>k&)#xf(lbb>*SqN6^J4rRt zLj~$j4{Vk}M(wQdYNMd70B945AXl9Xgg`bgNg{(*kMV|(;R(UA^CxeeQ(}q-ndvS_ zaozJa7~U7*&^%F~Q;zgZ6=r4Dc=&7N0B6%JV>CQoWY+~Ok3|2n11lX(CpzyCW0$;K z){-Zr)@jB5EFlYTGvQJ2lG(VYpN4mBQ;V~B-+)$XndI3d_Ft(;q*Q1-n}DDtvTFGw z;nq%n*9O1N00HcEvk*F?hm@Y>OF8xKkA%C-{@&Sqr3@{V;EIZAOeT-l5W$Ff7rGm7!fHPL-7iFDW|t z9wj^fP4eZlE)ZR+)j7{0h(1&~jq5K0xEPE*Yk;EKCP_D-r5W@v;y!Q~HyW>@U?NZ3 zFOVBH&7ycT2EJ|y(dmoQ?Z1p-a(*yQcm)_G)^# z<8|9*eaPV>6k9RWqqRwKtPT=9SZ^1It&XQRk!SYtv{+9Nk4%9ATfL1bUORxR@Eo{1HM5 zs#Nj6hj-oKqfW`kEyT1gqZaOpxK< zJB==chEMXcpRW!#W;n$)(ndxa{t!LND!G|i_32z>SA;jvVYTA>Ex#Jx)x^Jk@mDdI z3O?GvMbOPKT}ulCduEnQ+?iQ%&g<9>Q$d1mW!5!J%B9OD3%4hsknDByE^og^U&_s3 z!^K6fd)woN>=!(NCL7NCO?SFH&~irMYf}fzt_{eAB`!GeVIstBBGCnt5!HQQ z*`Mh?%VQ4on}yNEd~TkB^h-SYAs#=BGfz>cXp$+2a}N19m7=G2aGn4YIls7raOHe_ zU+=BAnl_?#zZ+^_{-!`u@r;$rlP4y$7~pyt+&nAf(}2cy1O=ReUz#!HyYSo`A0m%M zE7(}nu;r;vyeCeYIeo8*fbYrOMrSz;;RcjXpr~hlYR7Jz&cs>m9L6af$xI?BasiE{ z#4{u5?j-$pW*Gm_ej2!&GBIN#Qg7XGR7bGWP8o z8Q`bSMvC5i8QeTGV)_eEbZt?2?99kGS7Q%W>E)=eFRkI_9227%(hT)z+%H=X7OsvG z>W?Q;JI&@kv^n}}OW7=K_dyouRwDlx*_jbzQNf}!=iAJ=K^KgUj+x$|BA#prRF%P8 z;vOGEnYi`uFsCZ{0?q-7jG!Z6rQwL137L@Y862>csvt!vh4Y8$o;@#zG58 zX-XbDGd$jp?oFWg%*2m$(9(mFf-R9A9_1^MhDT3w5RQ+2l?twcA7=u&0&ODWSpJ#e zgh9@|f)j825QsTeic|Cz^qD4zT%d?T#sU1{q2W&ar4?Qr*qB3Tj*v-o<9rfvLW?;4 z8JNj=B>6r=DAkA}HeGmJj8P(=pqZh=L+SMJzJ2toG>{%4NlwqCaw)6~hWSS}(bLaW zbmFleNL37@hB!Kceuq`U)W-+0+cP|hDCQZDt8mYPjU=;u!}|2sNCL&d|2Vc`kP5~S zRx^spx}xO_ZfC+82%gDej2srp8!j6zGzi_oKL&aZnxq4VOqzEPN0ANkgNGS6yjiQ_ zp1}IhV(vL$&>XnUpgwreq#Zo$W4`qeW1i4ED7ppcEAQf7ZROJ}adCqB@1h<-P``*! z#rirOebnE2xtJoq9bDVuJP{yqG@vXng9CI6gH5X8kKgG_MK8TH2|=~M7peHEkq3?f zgNX835@qM0G!aNZ$L_pmv?Ea zTr8w(%G59N3M9W>*Fr^5s3dA56Xy{_0?_%=N zK0Wx1blEcvoY2SrQV=YD@Pt2PevFmN+hM?r3kY}}AWgmVhDg|VPd#}MAzaXwhlyPwr60T!PQO^72nR2;;j_wZqCBOlOXhPFmglN6KT#+@7aSZKm~@b zi;3x-3}|?5>e2j$g^Oh~?>E}L4`K*mgBUYXd`5>Z`lYd4)7vwYP0-Pyj`Z=@-G6lC zo)h=II)*3er%GOKlIB&eM^ie~fm2=`ICRX3oV8cwnF4JS)|Bg=7I)JIL0W9v8zHZTm|8=o%5M|ya9nC+xQ zVx*mhqnHu4yMZ{mSJI;6>DYW(J^iNbt)8SHHeBN=X)8XnVCyL*M>yz;5K#Y)v!)RW zN2r)Ua{EUH)7r$w!!1i(=Op4b>K8*f55>ujVe4Dd+IeOqff|!c5>D;umD_wdxTw(t z6zAzkyf`6C1vug9GtuLOB02mlPLt857e5fd{sh@(I6q#ThK%!n(td;$B7=a@^se4R z(6eO~`d^#2dphlw-b0B)x5g7?Ltb6#xC3ckG4!=n5reE$HlFZPVX(0+1JkZb2Q+5@En1AuH1q^!yEQ2W^+T?a$mO0xAA9l!PcEJb6uI%-(+=(F(+MhF@2xR zgcAAW&mlIH=ptK?1M?LeeIx^+Tu!s|l7n;t81XnSqLMR(iSj7jf{r(KOL2lOtIt0f z-lpF1Y&ddlpn$sT+36fZrcs87Bn6IdB zJsaM0li#{B=5yU=7rW*w8u-z#Y`)2BZ%?)(-UbcqM1}@x?~!}!e1=#?RiiR!eYT_T z>?tz*7EWV}e+tX(d@?&#O2Tj=eS^%D8hyic*U>TDDPGOMH9@%)lCK9X-o#{ZK5;r# z;vDOt;5UI8b&UQU7`QdwNk0;(rJsIW!j(RnLi%)ww8xBNd<@nePEL{>f=Yf^KA9tR zNgE7ji!*w3qu>by#?pH}zSJ560aJlo1-jZXW`0)?-J_W5qj^KaQx;Gd}Wy&ntj z-asI5axvt~&xQ9j%g=4khdVp?rwOh&qL0y~=JD8$bet(S{(N}XkpS>RhQ7{@j$5w zU9DxLES~{$t0f2L{Au?h9X)e)I#am7ShXf0QKKP>SQw5lTT-{M=5L9~LA5wVO|%>dPG%jfY^9iOr~hKAo#f9_~5H3ls_DS^}xMp&Yj58it%e|0wUb!@FNk zwi(KwLIRoJWPMXo0S?{50D&2EqTpOz!6(f8{f$>_AWN;rNn9r$V0y@7Rks zJgrM=u&4JnTn{kN+YNtJ0BlQkaPZKjp4)rl{chWr_u`c|JB{+h~O5liKS~Q-OiP;ijU6U?af|J5}nXe-4nT(?kFC(m(upP-_5O zkw01~;q3Qa!$*!DyIURoop8U$*07Gi0>g>fyst!&t!dD6Sa+mUs1M%d2l!L>1@t&b zNJ|n;*1YQkn+{!s$-C6Mde#ANl{{)in$Qjo_V!b2aJdk^_8o{13>>^fNCyWGQpN$! z=-tR4m_BrHS#w7I zB-Gv?2ygWg!blSr14O;?+Oz|8(hk}ck04yWm?^c%0ae`c&Oe6dO66inevjrV*e}4L zQO>zvAMW=m^3A?3|K5b)F&};iS~P5#ZI~o3o}u&M@g)YtUUwc^Gk1deIaU`?zrBLH z!!bk42NQ%Pc{$BUPCzy4*BW9P{iRDwFgFAA(vpi4q-p7;#XkNtt;1x=_r_}jYABc~ zk5|%F@ut*G!W3Q1Y)Q@`=8=PF%F6p>xV43`98q8Uc^rp$`jg=ePQq68`=1Q&a1%V| zmEL7dEI%%OFPtpXxMJa*|}+OkoUlSYiKfGD$}mYak)Z_$>5&i+yAlAjQi^8 zetg?{ddb`EvDfHIJk{ z#!|+~l>i5Wx!47(=FT9)!xY41PG_nz(>PvmE;pKg6o;^=pU&YXCkum{$!Ms-zU3s5 z+SFndi+#CVX0SWy@_P}$m@kVOhv^u#<@cdK82)&%c!BQ|*Y|*NqJeW>iX(py=NUHY zt`Z&KW1)-0WrS1#!d^3slSX=z_aoMhWONP0btoYxkA4Ar&Bhw+G$w+r%Fr7W_j_RO zusBDB0KXA1ExE*M__YgwVbGoa+$g2Ydv*573CHkY2=2>JNj?6>O*^Fzk7ctg z_rNO>RS`f@Y2hxz1J!f<8XU=IND2)Sy+eUDc-xm2Wx-pRv?;(b={UrhTSx~kf)d}D zTq-4ZN|Bw+sf1i^>*33vII_u{|ED`({F|!+S(KwMt->xI1yQ*VX6l=~>f}gBBD|_D zG4+kep$fgYr{kynmc{#si~T;`E-G!hU=w>8r``D(Q?PhHZmp`vL^daDnuYyzx~eO_ z*y*KhEx6^%V6&T_H6_h0UbrXA7W9ijM}CKl@(}5{L=yuCS+cNLBG$kbx8VEJsar|S zyDZwb&(b!C0Q4nei|6m52sDHq(cb|saio%S?+24CGSH2brl>0d*vGi|cygiB!0_Sz z6D|cBCcfX&nOuz1?F6QA#!xmWmKQqpDA9KXcs!8&@}jG0CSZc-9~!GRK+qzx&LK{D z1=bR&n!VbN!tE3AWZ{DKsjcipV$Zq1D*vVbCwwfSLD^-#m)5Vg5PgtJ@C#h~yW!z3 zS>sYId$p})Hy-tOZJ~%?NIh~gw3ED2zxTW0GLF3m8|YecG<#{Q&TImfwIM3ZJxUIo z3DMn0c z(SG&J3*nP|*+6w=GD$Q0-FoVfC6J`796(#Q&aL{!{fSV!@Y$wtcb59~7s59x@5S(q zp=I^%7sGGxaJp2~@C&yej|!dIDrrF?5W|jt9|;^Ft&ROW`yJu_9Vs z-bxCfjt}Mg${tWuca+Afg*Z@V3^>Ofnucm~`wn)KfM_GlkX)tHhRq7jqa_@BCyt9c zPV&bQ=vh5OvB}J_wyf^?lTWgWIVu+Qf@nW2O^5?vQGg*aX(LX_R;jhBymNY3i_VAP z?N@~lIWp_ghm+n+C^BV302lsi6c{x#xluNwR#nE5t(^pb_j2ViZkHvUvCx}OP_sVV zYG6W)OB9b+z39}lfkT*Jw3Xr6d9wPdQU$4y3iFEG5XYr=)O$y_ZuRgYGzVC+^WxRH zMOS+1xoFNLDY4Te&2<1YYSRMIwHA~SoNb0`^85Uh3%SIivzP5>%+nE(ARw%@3Sq(nN7qn`NWZJy`U8h zVhg10FOmEsnTqI_jsKA=a!l_Jqsn#fxF?50QKJp6+!M=N>T7?~T{9+;(Ra)b0aY8#;k~Ngr?o)TZ z6yA26<_G9cEwQZs>ZmH876HcwC)UJyXP~K1-`Kc|qk8BLZQU;7p@_ z7(0dogUBVxr<5Yc>3VIU+lV(UaLu@-x@jB-)e!DmvO|qR-v}c?maA!4L*S_$BI-<= z@0VGk(`%rLL?3@x`cVOG1u`}NwWAu%<#k-`s16PWD zTB+OVeC(1_gUjmAZ*1H$NTFT$A|ar^W(!@E8MCZvoCkV94SgoObCUx`^zvlaPVs3n zHi(^q54p9)X&>5x4Avo|K5e#$nAJ@Dyu5u;+mikome@Prv!@(J1(_cZff@|`(mK3G z$Q*JwhPAl*=4ZmY#2shHuwz__gP=Nx?R0ibVc9c@1sFUK{;Dxhk+ULT?pst$rqGi1 zoE1SmjH{Kj+efPb(Co_VR64U*OR13uoOlYz)3V7xx^z{Y()7He-|C?{5Pbm%-3=3q z*tyMTheft29AG+!SCE3qRbxUra59rGIi1IK3wh#@lmwAWdwzu+Q}EGa$se=80h@`z222 zTCK8niw?DM*tA0rQOfuk7bNh1yOP$zLsK*t)kQBzlr? zI?LvVJW!#D@JuS^cpJ?@Rp@+|3?%1g%cudKo+>hqnyh-2^Kmp|g;mu8uMTZvxYhXA znO4Epg35c9-vc>G4`&=~HAcm((tcwD1?sEUXZ4t%<6I!v#?6U%oah5;(_g{0R}YEV zv&t6da1JEs7_!`tJCBhdU=YtAcH#ycmL)1S7#tVa*a(gj#=V@?Qq8JB1XWx7a$mzJ zF`mbT777ee*&AciSb#X+flmah+OOXG_VBj$;0{`%?#m_wxz%$9s@Y0+s;IF@zjuWd z)K{K1A~C8;8JV*j9mTq`)6s&Rt7t(WwSiY03p5Y}G$B|N-=k}UvPe%XdahZ4L+IMv zKn#7pm?nJ!L9(m=t{_sYgQ<2BI9k}=hw#25Vyx7ZPx!6e&ovC-)UwvxBujqw0FGz{ zaK)=9DpE$cj543Z-NCDq)mcLW2-QlGr&W)6-tVy3kxr3~|LiW;F|VWrm$DC9YO0xC z!z?%cnPtS;wO?|C#;#HD#F2I(bMA@qeYtrKlc05q3?YO~ao(LKfMS{Qbl`;9Xs51W zC~Jk&t@|T#N=H`v&bku_`tTnXnsj7JLe-@bLoc1?sd5q!!eOXG+C->Y16tAqiKRgz z6V?h$&|{mXF3f&zfC&BO89b5b=axxR(@P6MZ;GclW{@TfBNjsav#%u0= zwd?o88~*d80aLx&!)uKfrbXxbh)s9|3^wD@t%n?3kUcT^jTTM6$6HFE=;nG*&yVvorNeNv(=(gB@BhS2O7o-*Vv3G?Yb?*BI zm7?q^qdp;Z_$?DEZ6$~VIx1F#rN*;I-43DmAoVQtOt_qesnWzWr0kO}<_h^mv7cF< zl7F)oWgBG2+;^~J@~npta+j2g3DwPE6fDTj&e>Rh{PA4 zD#hduFX5%tOQlkJY>7;2QSE5D`t;x6Y>Q?&HE5WwH(SQa#f75l{;5%%DHl88c6?q% zPy<&ja|{Mk5S*4i^0I?LfRr6_FNS7s(?+K4s`cE1Og3JEl~EZ^uEwmNFQ`LX z4dgyFotiR~g_-RQ%oTz(z&bu);~BdZb%|G6wqYC6okM2s^Vl^u$y;SW2~PZXY) z;hTQrOY#l>ha{wf`Mme%jNzqOV{?ccS`)kMg?I7lAe)E&#Ky?Z$dL+TLc#vd*>!5kJ?2! zk9<)eGE|aKd9s$rF$TK8$Nw^WBW_x-7l+&|HSl+I4;)4wsHHzR(pEZ3PsE$$G979q zdzUilIxS}BQBx!5u1*>)MCI~MDo(Qs!)g=6Y-@V*sIdf$N((`aTTos`;j&_6n4(U} zgxfAr3^>}mggUuhvc4YZjW5aJI7*b`GG))c2ZQHRhzDjZZVxGNs$7y1s3y>76O(nQ zGKA;_ffF088;X_FMq1;|3uj4@(%U}LCx(0T`vn@kqcw%;9yv5|R07e=Q6;0L(H6v~ z%vcfN6&J(_BVd{gy2-iC z1${T@{~1i(^qwFtMH$p!cR^Y6H(j%nGoKaQHJd)Glhe}=RQW=;&DQEbr_!B)VpcFy zkeU*}^#h>Z8f2zD2-w+!s{z)|U_+)Wba9Guz$18Cb|npU}lA zFAZb>PxGloY`Ou50C?hd`ovHn(ExBJM+gEhz69L_0BvIeoBCiLI6J~Ppi}93I~};fA7G5AKy99H0kwDX>Wb z>;-{E!5a&~OMSrJ1=S9q^*m5|dV2_$suyzb!h#&#QK)V~m=APKt)>R#MgvXj_B$b5 rK+FxqJV49~#C$-^55xjMEC|FxKr9TzB0ww(#9}}!zWq*!g#R4?PMaQM diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 957e6e556e..101bc28a66 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,8 +1,8 @@ { "/js/build/app.js": "/js/build/app.js?id=82ddaa718cced6fb0be6e8db6f16a0c0", "/css/dist/skins/skin-blue.css": "/css/dist/skins/skin-blue.css?id=f677207c6cf9678eb539abecb408c374", - "/css/build/overrides.css": "/css/build/overrides.css?id=5166569ede5a36802eadeea982686ca6", - "/css/build/app.css": "/css/build/app.css?id=b612c48e78fece2e1e8042ae24cc5f1e", + "/css/build/overrides.css": "/css/build/overrides.css?id=1681749b20329c40a052156ea4cb42fe", + "/css/build/app.css": "/css/build/app.css?id=cc0fd2d77504fdd7f03e91e2369d02a9", "/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=dc383f8560a8d4adb51d44fb4043e03b", "/css/dist/skins/skin-orange.css": "/css/dist/skins/skin-orange.css?id=6f0563e726c2fe4fab4026daaa5bfdf2", "/css/dist/skins/skin-orange-dark.css": "/css/dist/skins/skin-orange-dark.css?id=e6e53eef152bba01a4c666a4d8b01117", @@ -18,7 +18,7 @@ "/css/dist/skins/skin-green.css": "/css/dist/skins/skin-green.css?id=0a82a6ae6bb4e58fe62d162c4fb50397", "/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=da6c7997d9de2f8329142399f0ce50da", "/css/dist/skins/skin-red.css": "/css/dist/skins/skin-red.css?id=44bf834f2110504a793dadec132a5898", - "/css/dist/all.css": "/css/dist/all.css?id=ae5d0ce9886bbe4ad4b021c6be19ec36", + "/css/dist/all.css": "/css/dist/all.css?id=dab91b6b3580c1eb6982e449f7265b3e", "/css/dist/signature-pad.css": "/css/dist/signature-pad.css?id=6a89d3cd901305e66ced1cf5f13147f7", "/css/dist/signature-pad.min.css": "/css/dist/signature-pad.min.css?id=6a89d3cd901305e66ced1cf5f13147f7", "/css/webfonts/fa-brands-400.ttf": "/css/webfonts/fa-brands-400.ttf?id=e2e2b1797606a266ed55549f5bb5a179", @@ -29,9 +29,9 @@ "/css/webfonts/fa-solid-900.woff2": "/css/webfonts/fa-solid-900.woff2?id=eea38615e7b5dbbaf88c263f2230cc32", "/css/webfonts/fa-v4compatibility.ttf": "/css/webfonts/fa-v4compatibility.ttf?id=6ebbf5afc34f54463abc2b81ca637364", "/css/webfonts/fa-v4compatibility.woff2": "/css/webfonts/fa-v4compatibility.woff2?id=67b8a78b7e80e805cfa4ee0421895ba4", - "/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=f5935cf8eaf9c1f71da0c9245d730471", + "/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=281bcfe26549412d128f695234961081", "/js/build/vendor.js": "/js/build/vendor.js?id=3592e07ae9a6d1805a4ea3bd3c034aef", - "/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=40e2dc8b5b29e244bb545f78e2a3242b", + "/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=df78f0c4cc93c29c02a41144590f6350", "/js/dist/all.js": "/js/dist/all.js?id=ba07d399f23b294f7c4983030b757423", "/css/dist/skins/skin-green.min.css": "/css/dist/skins/skin-green.min.css?id=0a82a6ae6bb4e58fe62d162c4fb50397", "/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=e36e83c2aa3c3afdbb8ebe2c0309e91d", diff --git a/resources/assets/less/overrides.less b/resources/assets/less/overrides.less index f5625bd7b4..af922fc080 100644 --- a/resources/assets/less/overrides.less +++ b/resources/assets/less/overrides.less @@ -680,15 +680,15 @@ th.css-accessory > .th-inner::before margin-top:160px; } } -@media screen and (max-width: 771px) and (min-width: 512px){ +@media screen and (max-width: 912px) and (min-width: 512px){ .sidebar-menu { - margin-top:160px + margin-top:100px } } -@media screen and (max-width: 1098px) and (min-width: 772px){ +@media screen and (max-width: 1268px) and (min-width: 912px){ .sidebar-menu { - margin-top:98px + margin-top:50px } } diff --git a/resources/views/components/checkin.blade.php b/resources/views/components/checkin.blade.php index 6a7055f727..e195685d2a 100644 --- a/resources/views/components/checkin.blade.php +++ b/resources/views/components/checkin.blade.php @@ -17,7 +17,7 @@

-
+ {{csrf_field()}}
diff --git a/resources/views/hardware/view.blade.php b/resources/views/hardware/view.blade.php index a583602958..0757be5ae5 100755 --- a/resources/views/hardware/view.blade.php +++ b/resources/views/hardware/view.blade.php @@ -1017,6 +1017,8 @@ {{ trans('general.qty') }} {{ trans('general.purchase_cost') }} {{trans('admin/hardware/form.serial')}} + {{trans('general.checkin')}} + @@ -1031,6 +1033,9 @@ {{ $component->pivot->assigned_qty }} {{ Helper::formatCurrencyOutput($component->purchase_cost) }} each {{ $component->serial }} + + {{ trans('general.checkin') }} + purchase_cost *$component->pivot->assigned_qty) ?> From 92776adb933ecb201cf8d8ee943310c33937668d Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 3 Oct 2023 12:31:58 -0700 Subject: [PATCH 03/45] remove unnecessary changes --- .../Components/ComponentCheckinController.php | 2 +- public/css/dist/all.css | Bin 549971 -> 549971 bytes public/css/dist/bootstrap-table.css | Bin 10766 -> 10766 bytes public/js/dist/bootstrap-table.js | Bin 1650987 -> 1674560 bytes public/mix-manifest.json | 10 +++++----- resources/assets/less/overrides.less | 8 ++++---- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Components/ComponentCheckinController.php b/app/Http/Controllers/Components/ComponentCheckinController.php index 395d75b6ac..65251b6c4c 100644 --- a/app/Http/Controllers/Components/ComponentCheckinController.php +++ b/app/Http/Controllers/Components/ComponentCheckinController.php @@ -43,7 +43,7 @@ class ComponentCheckinController extends Controller return view('components/checkin', compact('component_assets', 'component', 'asset')); } -// return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); + return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); } /** diff --git a/public/css/dist/all.css b/public/css/dist/all.css index de7c6eb78657e71b26341b9ba15459720760c24d..3313bdac45e5252b81120619f34e0552a8aa19ec 100644 GIT binary patch delta 125 zcmcb7LhF7M2#)7Pc+y2cj7bwjYdU*DYo?H#eOA@f^Fu^dslkwO9-d lEG5e{>6qk;-eh3e@G&ao>qSz2sgaGw2LGfB#Y1psJ)EkOVP delta 155 zcmcb7LhF7M2#)7Pc+y2cj7bw;zmV*DYqYG&Gw2@f^FubpC#Jj_Hza zjNH>Z+8KGL>l|k1Vlgx_vjEA8Z~&DRRA?$xPhW73U75+$VEcme?C+W>(Jd?h04HfP AhyVZp diff --git a/public/css/dist/bootstrap-table.css b/public/css/dist/bootstrap-table.css index 301c592a5da8e76b73294d43a40149fb9078e798..c8749ad4b4e92b9bbbca0add1ad839ccb627fd44 100644 GIT binary patch delta 12 TcmeAR=?j_Q%4o3B?Sv)(A9w__ delta 12 TcmeAR=?j_Q%4oRJ?Sv)(AAJP0 diff --git a/public/js/dist/bootstrap-table.js b/public/js/dist/bootstrap-table.js index c01fba3e19035a8e5bb2b8769cee880912637316..53d6e2d52d349f6e3cf66d89902d38852c30b11d 100644 GIT binary patch delta 67613 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 delta 44011 zcmbWg33yyrc{l!C?QrMaG~(GuIlGrF3{vK>3#Ejvyki{#EOYc|h} zEXk6XBrJuNC7{A7{eVJgDJ@GvU8;Xc0!d4uG;JX*Z3!)uw6uk!gyd`gwDe>7e(yQw zE;EvneC5H>opaCno_9a*dGC|In*78+#vjcoO5u85`DCYZmGwW_JhN`vYj~69WTv$1 z>e7d{-J?viE^p&L=KX9(|I!c7?qm-?)qKagva8ZxY~Q`~pWF7c`)_Lh(e<4-|Ey_U z$@SL1`%jkseS15L9BTT&^^bP@HZ1MftzxW!(Z(Qq=}^ZtrN{<0bhclAc;A7Iipd^) zW8)5X`>(e*v!6$sT9$rvD7E1Lx+~{TM=vL0%-<|B3zai%B?v_g} z)GYD?sg4KPk56>0zkc7{-|tv@>@I5b)DM(a_DEOz#-(@kdal3W$~)?mJbUVm9oqGM z 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

XL3LH^rWtGSQRBKW~ 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 .th-inner::before margin-top:160px; } } -@media screen and (max-width: 912px) and (min-width: 512px){ +@media screen and (max-width: 771px) and (min-width: 512px){ .sidebar-menu { - margin-top:100px + margin-top:160px } } -@media screen and (max-width: 1268px) and (min-width: 912px){ +@media screen and (max-width: 1098px) and (min-width: 772px){ .sidebar-menu { - margin-top:50px + margin-top:98px } } From c69958d95da7847d80ce83d810e1835fde7d86c8 Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 3 Oct 2023 12:32:24 -0700 Subject: [PATCH 04/45] removed dead space --- app/Http/Controllers/Components/ComponentCheckinController.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Http/Controllers/Components/ComponentCheckinController.php b/app/Http/Controllers/Components/ComponentCheckinController.php index 65251b6c4c..49199aa6d2 100644 --- a/app/Http/Controllers/Components/ComponentCheckinController.php +++ b/app/Http/Controllers/Components/ComponentCheckinController.php @@ -30,7 +30,6 @@ class ComponentCheckinController extends Controller // This could probably be done more cleanly but I am very tired. - @snipe if ($component_assets = DB::table('components_assets')->find($component_asset_id)) { - if (is_null($component = Component::find($component_assets->component_id))) { return redirect()->route('components.index')->with('error', trans('admin/components/messages.not_found')); } From 37c1d6fc04614d56cedf8b3a7c0b53321709a24a Mon Sep 17 00:00:00 2001 From: Godfrey M Date: Tue, 3 Oct 2023 12:45:13 -0700 Subject: [PATCH 05/45] removed unnecessary changes --- public/css/build/app.css | Bin 23442 -> 23442 bytes public/css/build/overrides.css | Bin 16592 -> 16592 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/css/build/app.css b/public/css/build/app.css index b82e27befc5532fafeaaac889f82bdf2d369ff03..c8fc02559764ca7ea02b17a3c6569bdb8bda9301 100644 GIT binary patch delta 51 zcmbQVopI83#tmn^n9a=%CtvV#n7r6ai^b5u(gMg4;V?HhDyYy@sGeN!rOae$vANz` GSO5U!S`iWe delta 54 zcmbQVopI83#tmn^m@N&BCSUM!nEZ~5W3q&|GP9AH1&}Yo0TeH&&{U|NT<@jKWNNUv I-dk7z02s9q&Hw-a diff --git a/public/css/build/overrides.css b/public/css/build/overrides.css index 4020194f849e99a391206cd7d1adfe7a359eb9f0..5111695ac77eeeacad649f1636f4a29b1a2300ef 100644 GIT binary patch delta 66 zcmcc6$atZVaRavjv$?t9WIh9j$q)6l6bub4Eea|$6%zAO6f|-(^K{EIQ%W+d6wJ+y UK*H6N_v$M%Sz2t~YalED0K_pAy#N3J delta 67 zcmcc6$atZVaRavjv!$WYWIh82MuW-z23qn)W)=k%nhJ?|DGD07nR&Y9nJFb1Rti8x UAmQrCd-au>Obs^gH4qj60IW Date: Wed, 4 Oct 2023 14:32:28 -0500 Subject: [PATCH 06/45] transaction --- ...add_column_for_explicit_date_to_assets.php | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index ae103ba153..ce1528defb 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -4,6 +4,7 @@ use App\Models\Asset; use Carbon\CarbonImmutable; use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Log; @@ -22,37 +23,44 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration // Update the eol_explicit column with the value from asset_eol_date if it exists and is different from the calculated value - Asset::whereNotNull('asset_eol_date')->with('model')->chunkById(500, function ($assetsWithEolDates) { - foreach ($assetsWithEolDates as $asset) { - if ($asset->asset_eol_date && $asset->purchase_date) { - try { - $months = CarbonImmutable::parse($asset->asset_eol_date)->diffInMonths($asset->purchase_date); - } catch (\Exception $e) { - Log::info('asset_eol_date invalid for asset '.$asset->id); - } - if ($asset->model->eol) { - if ($months != $asset->model->eol) { + $assetsToUpdateEolExplicit = []; + DB::transaction(function() { + Asset::whereNotNull('asset_eol_date')->with('model')->chunkById(500, function ($assetsWithEolDates) { + foreach ($assetsWithEolDates as $asset) { + if ($asset->asset_eol_date && $asset->purchase_date) { + try { + $months = CarbonImmutable::parse($asset->asset_eol_date)->diffInMonths($asset->purchase_date); + } catch (\Exception $e) { + Log::info('asset_eol_date invalid for asset ' . $asset->id); + } + if ($asset->model->eol) { + if ($months != $asset->model->eol) { + $assetToUpdateEolExplicit = $asset->id; + //$asset->update(['eol_explicit' => true]); + } + } else { $asset->update(['eol_explicit' => true]); } - } else { - $asset->update(['eol_explicit' => true]); } } - } + }); }); + //Asset::whereIn('id', $assetToUpdateEolExplicit)->update(['eol_explicit' => true]); - // Update the asset_eol_date column with the calculated value if it doesn't exist - Asset::whereNull('asset_eol_date')->with('model')->chunkById(500, function ($assets) { - foreach ($assets as $asset) { - if ($asset->model->eol && $asset->purchase_date) { - try { - $asset_eol_date = CarbonImmutable::parse($asset->purchase_date)->addMonths($asset->model->eol)->format('Y-m-d'); - $asset->update(['asset_eol_date' => $asset_eol_date]); - } catch (\Exception $e) { - Log::info('purchase date invalid for asset '.$asset->id); + // Update the asset_eol_date column with the calculated value if it doesn't exist + DB::transaction(function () { + Asset::whereNull('asset_eol_date')->with('model')->chunkById(500, function ($assets) { + foreach ($assets as $asset) { + if ($asset->model->eol && $asset->purchase_date) { + try { + $asset_eol_date = CarbonImmutable::parse($asset->purchase_date)->addMonths($asset->model->eol)->format('Y-m-d'); + $asset->update(['asset_eol_date' => $asset_eol_date]); + } catch (\Exception $e) { + Log::info('purchase date invalid for asset ' . $asset->id); + } } } - } + }); }); } From cb10c7af2798b82f8aec4b05ae42137785d89829 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 4 Oct 2023 14:33:35 -0500 Subject: [PATCH 07/45] oops --- ...ormalized_eol_and_add_column_for_explicit_date_to_assets.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index ce1528defb..c1eee5ea1b 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -36,7 +36,7 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration if ($asset->model->eol) { if ($months != $asset->model->eol) { $assetToUpdateEolExplicit = $asset->id; - //$asset->update(['eol_explicit' => true]); + $asset->update(['eol_explicit' => true]); } } else { $asset->update(['eol_explicit' => true]); From ad6b5020059dc77c520cab6be4b0c74e60f68398 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 4 Oct 2023 14:37:18 -0500 Subject: [PATCH 08/45] comments --- ...malized_eol_and_add_column_for_explicit_date_to_assets.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index c1eee5ea1b..306b551f7b 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -23,7 +23,7 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration // Update the eol_explicit column with the value from asset_eol_date if it exists and is different from the calculated value - $assetsToUpdateEolExplicit = []; + //$assetsToUpdateEolExplicit = []; DB::transaction(function() { Asset::whereNotNull('asset_eol_date')->with('model')->chunkById(500, function ($assetsWithEolDates) { foreach ($assetsWithEolDates as $asset) { @@ -35,7 +35,7 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration } if ($asset->model->eol) { if ($months != $asset->model->eol) { - $assetToUpdateEolExplicit = $asset->id; + //$assetToUpdateEolExplicit = $asset->id; $asset->update(['eol_explicit' => true]); } } else { From 101bd9c4049fc6d2fe7ef583224c40449dc9a63d Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 4 Oct 2023 14:47:14 -0500 Subject: [PATCH 09/45] kill transaction, try update array --- ...eol_and_add_column_for_explicit_date_to_assets.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index 306b551f7b..7b477c9a3b 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -23,8 +23,7 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration // Update the eol_explicit column with the value from asset_eol_date if it exists and is different from the calculated value - //$assetsToUpdateEolExplicit = []; - DB::transaction(function() { + $assetsToUpdateEolExplicit = []; Asset::whereNotNull('asset_eol_date')->with('model')->chunkById(500, function ($assetsWithEolDates) { foreach ($assetsWithEolDates as $asset) { if ($asset->asset_eol_date && $asset->purchase_date) { @@ -35,20 +34,19 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration } if ($asset->model->eol) { if ($months != $asset->model->eol) { - //$assetToUpdateEolExplicit = $asset->id; + $assetsToUpdateEolExplicit = $asset->id; $asset->update(['eol_explicit' => true]); } } else { + $assetsToUpdateEolExplicit = $asset->id; $asset->update(['eol_explicit' => true]); } } } }); - }); - //Asset::whereIn('id', $assetToUpdateEolExplicit)->update(['eol_explicit' => true]); + Asset::whereIn('id', $assetsToUpdateEolExplicit)->update(['eol_explicit' => true]); // Update the asset_eol_date column with the calculated value if it doesn't exist - DB::transaction(function () { Asset::whereNull('asset_eol_date')->with('model')->chunkById(500, function ($assets) { foreach ($assets as $asset) { if ($asset->model->eol && $asset->purchase_date) { @@ -61,7 +59,6 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration } } }); - }); } From 6cda9056b8854d7b877c6cb90c361018bc7d51bd Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 4 Oct 2023 14:56:18 -0500 Subject: [PATCH 10/45] oops --- ...malized_eol_and_add_column_for_explicit_date_to_assets.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index 7b477c9a3b..756d48f849 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -35,11 +35,11 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration if ($asset->model->eol) { if ($months != $asset->model->eol) { $assetsToUpdateEolExplicit = $asset->id; - $asset->update(['eol_explicit' => true]); + //$asset->update(['eol_explicit' => true]); } } else { $assetsToUpdateEolExplicit = $asset->id; - $asset->update(['eol_explicit' => true]); + //$asset->update(['eol_explicit' => true]); } } } From 46af40bd027168a1ab521e58c6cc49d433c28884 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 4 Oct 2023 15:20:16 -0500 Subject: [PATCH 11/45] ????? --- ...add_column_for_explicit_date_to_assets.php | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index 756d48f849..15f54f4e05 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -23,7 +23,6 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration // Update the eol_explicit column with the value from asset_eol_date if it exists and is different from the calculated value - $assetsToUpdateEolExplicit = []; Asset::whereNotNull('asset_eol_date')->with('model')->chunkById(500, function ($assetsWithEolDates) { foreach ($assetsWithEolDates as $asset) { if ($asset->asset_eol_date && $asset->purchase_date) { @@ -34,31 +33,30 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration } if ($asset->model->eol) { if ($months != $asset->model->eol) { - $assetsToUpdateEolExplicit = $asset->id; - //$asset->update(['eol_explicit' => true]); + $asset->update(['eol_explicit' => true]); } } else { - $assetsToUpdateEolExplicit = $asset->id; - //$asset->update(['eol_explicit' => true]); + $asset->update(['eol_explicit' => true]); } } } }); - Asset::whereIn('id', $assetsToUpdateEolExplicit)->update(['eol_explicit' => true]); // Update the asset_eol_date column with the calculated value if it doesn't exist - Asset::whereNull('asset_eol_date')->with('model')->chunkById(500, function ($assets) { - foreach ($assets as $asset) { - if ($asset->model->eol && $asset->purchase_date) { - try { - $asset_eol_date = CarbonImmutable::parse($asset->purchase_date)->addMonths($asset->model->eol)->format('Y-m-d'); - $asset->update(['asset_eol_date' => $asset_eol_date]); - } catch (\Exception $e) { - Log::info('purchase date invalid for asset ' . $asset->id); - } - } - } - }); + // Asset::whereNull('asset_eol_date')->with('model')->chunkById(500, function ($assets) { + // foreach ($assets as $asset) { + // if ($asset->model->eol && $asset->purchase_date) { + // try { + // $asset_eol_date = CarbonImmutable::parse($asset->purchase_date)->addMonths($asset->model->eol)->format('Y-m-d'); + // $asset->update(['asset_eol_date' => $asset_eol_date]); + // } catch (\Exception $e) { + // Log::info('purchase date invalid for asset ' . $asset->id); + // } + // } + // } + // }); + Asset::whereNull('asset_eol_date')->whereNotNull('purchase_date')->has('model') + ->update(['asset_eol_date' => DB::raw('LEFT JOIN models ON assets.model_id = models.id) DATE_ADD(purchase_date, INTERVAL models.eol MONTH)')]); } From 8c9961aba8ab27c796b0391f5c4b8659082032f3 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 4 Oct 2023 15:40:42 -0500 Subject: [PATCH 12/45] refactor --- ...eol_and_add_column_for_explicit_date_to_assets.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index 15f54f4e05..86f1844fce 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -55,8 +55,15 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration // } // } // }); - Asset::whereNull('asset_eol_date')->whereNotNull('purchase_date')->has('model') - ->update(['asset_eol_date' => DB::raw('LEFT JOIN models ON assets.model_id = models.id) DATE_ADD(purchase_date, INTERVAL models.eol MONTH)')]); + // Asset::whereNull('asset_eol_date')->whereNotNull('purchase_date')->has('model') + // ->update(['asset_eol_date' => DB::raw('LEFT JOIN models ON assets.model_id = models.id) DATE_ADD(purchase_date, INTERVAL models.eol MONTH)')]); + DB::table('assets') + ->whereNull('asset_eol_date') + ->whereNotNull('purchase_date') + ->join('models', 'assets.model_id', '=', 'models.id') + ->update([ + 'asset_eol_date' => DB::raw('DATE_ADD(purchase_date, INTERVAL models.eol MONTH)') + ]); } From cc82e86eeb761437ce9c6cff575274c0950ab4d3 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 4 Oct 2023 16:54:56 -0500 Subject: [PATCH 13/45] one more check --- ...normalized_eol_and_add_column_for_explicit_date_to_assets.php | 1 + 1 file changed, 1 insertion(+) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index 86f1844fce..a84688f773 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -60,6 +60,7 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration DB::table('assets') ->whereNull('asset_eol_date') ->whereNotNull('purchase_date') + ->whereNotNull('model_id') ->join('models', 'assets.model_id', '=', 'models.id') ->update([ 'asset_eol_date' => DB::raw('DATE_ADD(purchase_date, INTERVAL models.eol MONTH)') From c07c0c0f74bbc33c391a2b014f635e3387c7a121 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 4 Oct 2023 16:55:35 -0500 Subject: [PATCH 14/45] cleanup --- ...and_add_column_for_explicit_date_to_assets.php | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index a84688f773..8bceca535e 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -42,21 +42,6 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration } }); - // Update the asset_eol_date column with the calculated value if it doesn't exist - // Asset::whereNull('asset_eol_date')->with('model')->chunkById(500, function ($assets) { - // foreach ($assets as $asset) { - // if ($asset->model->eol && $asset->purchase_date) { - // try { - // $asset_eol_date = CarbonImmutable::parse($asset->purchase_date)->addMonths($asset->model->eol)->format('Y-m-d'); - // $asset->update(['asset_eol_date' => $asset_eol_date]); - // } catch (\Exception $e) { - // Log::info('purchase date invalid for asset ' . $asset->id); - // } - // } - // } - // }); - // Asset::whereNull('asset_eol_date')->whereNotNull('purchase_date')->has('model') - // ->update(['asset_eol_date' => DB::raw('LEFT JOIN models ON assets.model_id = models.id) DATE_ADD(purchase_date, INTERVAL models.eol MONTH)')]); DB::table('assets') ->whereNull('asset_eol_date') ->whereNotNull('purchase_date') From 8d921359ca3a043d9a693a22c8e5fcc1de027f7c Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 5 Oct 2023 14:12:36 +0100 Subject: [PATCH 15/45] [Snyk] Security upgrade css-loader from 4.3.0 to 5.0.0 #13685 Signed-off-by: snipe --- package-lock.json | 221 ++++++++++------------------------------------ package.json | 2 +- 2 files changed, 48 insertions(+), 175 deletions(-) diff --git a/package-lock.json b/package-lock.json index d9ef739273..b6254682a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3546,11 +3546,6 @@ "tslib": "^2.0.3" } }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -4175,24 +4170,27 @@ } }, "css-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", - "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", "requires": { - "camelcase": "^6.0.0", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", + "icss-utils": "^5.1.0", "loader-utils": "^2.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.3", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.1", - "semver": "^7.3.2" + "schema-utils": "^3.0.0", + "semver": "^7.3.5" }, "dependencies": { + "@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==" + }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -4203,32 +4201,23 @@ "json5": "^2.1.2" } }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -15328,33 +15317,9 @@ } }, "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" }, "ieee754": { "version": "1.2.1", @@ -16836,8 +16801,7 @@ "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "needle": { "version": "3.2.0", @@ -17479,7 +17443,6 @@ "version": "8.4.5", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", - "dev": true, "requires": { "nanoid": "^3.1.30", "picocolors": "^1.0.0", @@ -17757,124 +17720,34 @@ } }, "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" }, "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", + "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "icss-utils": "^5.0.0" } }, "postcss-normalize-charset": { @@ -18604,6 +18477,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, "requires": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -18875,8 +18749,7 @@ "source-map-js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", - "dev": true + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" }, "source-map-support": { "version": "0.5.21", diff --git a/package.json b/package.json index dc1ed3f8d5..2e220c597a 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "bootstrap-table": "1.22.1", "chart.js": "^2.9.4", "clipboard": "^2.0.11", - "css-loader": "^4.0.0", + "css-loader": "^5.0.0", "ekko-lightbox": "^5.1.1", "imagemin": "^8.0.1", "jquery-form-validator": "^2.3.79", From eea2eabaeef16fc8f3a1d61b19c06e9fc8ed942a Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 6 Oct 2023 19:45:23 +0100 Subject: [PATCH 16/45] Escaping asset history old/new values Signed-off-by: snipe --- .../Transformers/ActionlogsTransformer.php | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/app/Http/Transformers/ActionlogsTransformer.php b/app/Http/Transformers/ActionlogsTransformer.php index 0a81f864bf..1cc105e6a9 100644 --- a/app/Http/Transformers/ActionlogsTransformer.php +++ b/app/Http/Transformers/ActionlogsTransformer.php @@ -178,24 +178,26 @@ class ActionlogsTransformer if(array_key_exists('rtd_location_id',$clean_meta)) { - $clean_meta['rtd_location_id']['old'] = $clean_meta['rtd_location_id']['old'] ? "[id: ".$clean_meta['rtd_location_id']['old']."] ". $location->find($clean_meta['rtd_location_id']['old'])->name : trans('general.unassigned'); - $clean_meta['rtd_location_id']['new'] = $clean_meta['rtd_location_id']['new'] ? "[id: ".$clean_meta['rtd_location_id']['new']."] ". $location->find($clean_meta['rtd_location_id']['new'])->name : trans('general.unassigned'); + $clean_meta['rtd_location_id']['old'] = $clean_meta['rtd_location_id']['old'] ? "[id: ".$clean_meta['rtd_location_id']['old']."] ". e($location->find($clean_meta['rtd_location_id']['old'])->name) : trans('general.unassigned'); + $clean_meta['rtd_location_id']['new'] = $clean_meta['rtd_location_id']['new'] ? "[id: ".$clean_meta['rtd_location_id']['new']."] ". e($location->find($clean_meta['rtd_location_id']['new'])->name) : trans('general.unassigned'); $clean_meta['Default Location'] = $clean_meta['rtd_location_id']; unset($clean_meta['rtd_location_id']); } - if(array_key_exists('location_id', $clean_meta)) { - $clean_meta['location_id']['old'] = $clean_meta['location_id']['old'] ? "[id: ".$clean_meta['location_id']['old']."] ".$location->find($clean_meta['location_id']['old'])->name : trans('general.unassigned'); - $clean_meta['location_id']['new'] = $clean_meta['location_id']['new'] ? "[id: ".$clean_meta['location_id']['new']."] ".$location->find($clean_meta['location_id']['new'])->name : trans('general.unassigned'); + + if (array_key_exists('location_id', $clean_meta)) { + $clean_meta['location_id']['old'] = $clean_meta['location_id']['old'] ? "[id: ".$clean_meta['location_id']['old']."] ".e($location->find($clean_meta['location_id']['old'])->name): trans('general.unassigned'); + $clean_meta['location_id']['new'] = $clean_meta['location_id']['new'] ? "[id: ".$clean_meta['location_id']['new']."] ".e($location->find($clean_meta['location_id']['new'])->name) : trans('general.unassigned'); $clean_meta['Current Location'] = $clean_meta['location_id']; unset($clean_meta['location_id']); } + if(array_key_exists('model_id', $clean_meta)) { $oldModel = $model->find($clean_meta['model_id']['old']); - $oldModelName = $oldModel->name ?? trans('admin/models/message.deleted'); + $oldModelName = $oldModel ? e($oldModel->name) : trans('admin/models/message.deleted'); $newModel = $model->find($clean_meta['model_id']['new']); - $newModelName = $newModel->name ?? trans('admin/models/message.deleted'); + $newModelName = $newModel ? e($newModel->name) : trans('admin/models/message.deleted'); $clean_meta['model_id']['old'] = "[id: ".$clean_meta['model_id']['old']."] ".$oldModelName; $clean_meta['model_id']['new'] = "[id: ".$clean_meta['model_id']['new']."] ".$newModelName; /** model is required at asset creation */ @@ -206,10 +208,10 @@ class ActionlogsTransformer if(array_key_exists('company_id', $clean_meta)) { $oldCompany = $company->find($clean_meta['company_id']['old']); - $oldCompanyName = $oldCompany->name ?? trans('admin/companies/message.deleted'); + $oldCompanyName = $oldCompany ? e($oldCompany->name) : trans('admin/company/message.deleted'); $newCompany = $company->find($clean_meta['company_id']['new']); - $newCompanyName = $newCompany->name ?? trans('admin/companies/message.deleted'); + $newCompanyName = $newCompany ? e($newCompany->name) : trans('admin/company/message.deleted'); $clean_meta['company_id']['old'] = $clean_meta['company_id']['old'] ? "[id: ".$clean_meta['company_id']['old']."] ". $oldCompanyName : trans('general.unassigned'); $clean_meta['company_id']['new'] = $clean_meta['company_id']['new'] ? "[id: ".$clean_meta['company_id']['new']."] ". $newCompanyName : trans('general.unassigned'); @@ -219,10 +221,10 @@ class ActionlogsTransformer if(array_key_exists('supplier_id', $clean_meta)) { $oldSupplier = $supplier->find($clean_meta['supplier_id']['old']); - $oldSupplierName = $oldSupplier->name ?? trans('admin/suppliers/message.deleted'); + $oldSupplierName = $oldSupplier ? e($oldSupplier->name) : trans('admin/suppliers/message.deleted'); $newSupplier = $supplier->find($clean_meta['supplier_id']['new']); - $newSupplierName = $newSupplier->name ?? trans('admin/suppliers/message.deleted'); + $newSupplierName = $newSupplier ? e($newSupplier->name) : trans('admin/suppliers/message.deleted'); $clean_meta['supplier_id']['old'] = $clean_meta['supplier_id']['old'] ? "[id: ".$clean_meta['supplier_id']['old']."] ". $oldSupplierName : trans('general.unassigned'); $clean_meta['supplier_id']['new'] = $clean_meta['supplier_id']['new'] ? "[id: ".$clean_meta['supplier_id']['new']."] ". $newSupplierName : trans('general.unassigned'); From 25a5507d9dd9891b3cb639528e8869cbd7ad0773 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 6 Oct 2023 20:07:35 +0100 Subject: [PATCH 17/45] Bumped version Signed-off-by: snipe --- config/version.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/version.php b/config/version.php index 664ae0ac32..8381c19637 100644 --- a/config/version.php +++ b/config/version.php @@ -1,10 +1,10 @@ 'v6.2.1', - 'full_app_version' => 'v6.2.1 - build 11625-gc45ede2d1', - 'build_version' => '11625', + 'app_version' => 'v6.2.2', + 'full_app_version' => 'v6.2.2 - build 11714-ga95fae0e9', + 'build_version' => '11714', 'prerelease_version' => '', - 'hash_version' => 'gc45ede2d1', - 'full_hash' => 'v6.2.1-47-gc45ede2d1', + 'hash_version' => 'ga95fae0e9', + 'full_hash' => 'v6.2.2-85-ga95fae0e9', 'branch' => 'develop', ); \ No newline at end of file From 5277f7cc5c76eaf9e36ee3c64f2fd1f313de43c2 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 6 Oct 2023 20:14:44 +0100 Subject: [PATCH 18/45] Dev assets Signed-off-by: snipe --- public/css/build/app.css | Bin 23442 -> 23442 bytes public/css/build/overrides.css | Bin 16592 -> 16592 bytes public/css/dist/all.css | Bin 550208 -> 550208 bytes public/mix-manifest.json | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/css/build/app.css b/public/css/build/app.css index c8fc02559764ca7ea02b17a3c6569bdb8bda9301..b82e27befc5532fafeaaac889f82bdf2d369ff03 100644 GIT binary patch delta 54 zcmbQVopI83#tmn^m@N&BCSUM!nEZ~5W3q&|GP9AH1&}Yo0TeH&&{U|NT<@jKWNNUv I-dk7z02s9q&Hw-a delta 51 zcmbQVopI83#tmn^n9a=%CtvV#n7r6ai^b5u(gMg4;V?HhDyYy@sGeN!rOae$vANz` GSO5U!S`iWe diff --git a/public/css/build/overrides.css b/public/css/build/overrides.css index 5111695ac77eeeacad649f1636f4a29b1a2300ef..4020194f849e99a391206cd7d1adfe7a359eb9f0 100644 GIT binary patch delta 67 zcmcc6$atZVaRavjv!$WYWIh82MuW-z23qn)W)=k%nhJ?|DGD07nR&Y9nJFb1Rti8x UAmQrCd-au>Obs^gH4qj60IWF7M2#)7Pc+yx6d6T}vlw?>b0M&zptEcy#XIEx2HQ3&Jf&E=GRg4i9006_j BH}e1h delta 145 zcmX?bO7Xxc#fBEf7N!>F7M2#)7Pc+yx6d=1n;TBQcb?s0`o{C@S_*~+mKFsSnhJ?| rDGD07nR&Y9nJFb1Rto0kMj+wp>AmOKm6 Date: Sat, 7 Oct 2023 11:34:37 +0100 Subject: [PATCH 19/45] Cast the request limit to intval before we try to abs() Signed-off-by: snipe --- app/Providers/SettingsServiceProvider.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/Providers/SettingsServiceProvider.php b/app/Providers/SettingsServiceProvider.php index 371fc234de..6656f284e0 100644 --- a/app/Providers/SettingsServiceProvider.php +++ b/app/Providers/SettingsServiceProvider.php @@ -33,12 +33,14 @@ class SettingsServiceProvider extends ServiceProvider // Make sure the limit is actually set, is an integer and does not exceed system limits \App::singleton('api_limit_value', function () { $limit = config('app.max_results'); + $int_limit = intval(request('limit')); - if ((abs(intval(request('limit'))) > 0) && (abs(request('limit')) <= config('app.max_results'))) { - $limit = abs(request('limit')); + if ((abs($int_limit) > 0) && ($int_limit <= config('app.max_results'))) { + $limit = abs($int_limit); } \Log::debug('Max in env: '.config('app.max_results')); \Log::debug('Original requested limit: '.request('limit')); + \Log::debug('Int limit: '.$int_limit); \Log::debug('Modified limit: '.$limit); \Log::debug('------------------------------'); From e5f58022357a55a9c351e1e77898ada6aad96ae0 Mon Sep 17 00:00:00 2001 From: snipe Date: Mon, 9 Oct 2023 15:17:03 +0100 Subject: [PATCH 20/45] Added tighter controls for matching log ID and item_id Signed-off-by: snipe --- .../AccessoriesFilesController.php | 5 ++--- .../Assets/AssetFilesController.php | 2 +- .../ConsumablesFilesController.php | 2 +- .../Licenses/LicenseFilesController.php | 2 +- .../Controllers/Users/UserFilesController.php | 20 ++++++++++--------- resources/lang/en/admin/users/message.php | 2 +- 6 files changed, 17 insertions(+), 16 deletions(-) diff --git a/app/Http/Controllers/Accessories/AccessoriesFilesController.php b/app/Http/Controllers/Accessories/AccessoriesFilesController.php index 4f166b06d5..939ab81260 100644 --- a/app/Http/Controllers/Accessories/AccessoriesFilesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesFilesController.php @@ -146,9 +146,8 @@ class AccessoriesFilesController extends Controller $this->authorize('view', $accessory); $this->authorize('accessories.files', $accessory); - if (! $log = Actionlog::find($fileId)) { - return response('No matching record for that asset/file', 500) - ->header('Content-Type', 'text/plain'); + if (! $log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $accessory->id)->first()) { + return redirect()->route('accessories.index')->with('error', trans('admin/users/message.log_record_not_found')); } $file = 'private_uploads/accessories/'.$log->filename; diff --git a/app/Http/Controllers/Assets/AssetFilesController.php b/app/Http/Controllers/Assets/AssetFilesController.php index a4e0605999..cfe8055bd6 100644 --- a/app/Http/Controllers/Assets/AssetFilesController.php +++ b/app/Http/Controllers/Assets/AssetFilesController.php @@ -86,7 +86,7 @@ class AssetFilesController extends Controller if (isset($asset->id)) { $this->authorize('view', $asset); - if (! $log = Actionlog::find($fileId)) { + if (! $log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $asset->id)->first()) { return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } diff --git a/app/Http/Controllers/Consumables/ConsumablesFilesController.php b/app/Http/Controllers/Consumables/ConsumablesFilesController.php index def1e0d8ed..4d9d1d5f7d 100644 --- a/app/Http/Controllers/Consumables/ConsumablesFilesController.php +++ b/app/Http/Controllers/Consumables/ConsumablesFilesController.php @@ -140,7 +140,7 @@ class ConsumablesFilesController extends Controller $this->authorize('view', $consumable); $this->authorize('consumables.files', $consumable); - if (! $log = Actionlog::find($fileId)) { + if (! $log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $consumable->id)->first()) { return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } diff --git a/app/Http/Controllers/Licenses/LicenseFilesController.php b/app/Http/Controllers/Licenses/LicenseFilesController.php index 442635669b..83fbc04903 100644 --- a/app/Http/Controllers/Licenses/LicenseFilesController.php +++ b/app/Http/Controllers/Licenses/LicenseFilesController.php @@ -137,7 +137,7 @@ class LicenseFilesController extends Controller $this->authorize('view', $license); $this->authorize('licenses.files', $license); - if (! $log = Actionlog::find($fileId)) { + if (! $log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $license->id)->first()) { return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } diff --git a/app/Http/Controllers/Users/UserFilesController.php b/app/Http/Controllers/Users/UserFilesController.php index 62726e9827..d0778dd570 100644 --- a/app/Http/Controllers/Users/UserFilesController.php +++ b/app/Http/Controllers/Users/UserFilesController.php @@ -143,18 +143,20 @@ class UserFilesController extends Controller $this->authorize('view', $user); - $log = Actionlog::find($fileId); + if ($log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $user->id)->first()) { - // Display the file inline - if (request('inline') == 'true') { - $headers = [ - 'Content-Disposition' => 'inline', - ]; - return Storage::download('private_uploads/users/'.$log->filename, $log->filename, $headers); + // Display the file inline + if (request('inline') == 'true') { + $headers = [ + 'Content-Disposition' => 'inline', + ]; + return Storage::download('private_uploads/users/'.$log->filename, $log->filename, $headers); + } + + return Storage::download('private_uploads/users/'.$log->filename); } - return Storage::download('private_uploads/users/'.$log->filename); - + return redirect()->route('users.index')->with('error', trans('admin/users/message.log_record_not_found')); } // Redirect to the user management page if the user doesn't exist diff --git a/resources/lang/en/admin/users/message.php b/resources/lang/en/admin/users/message.php index adf26b3229..a3f936dcbb 100644 --- a/resources/lang/en/admin/users/message.php +++ b/resources/lang/en/admin/users/message.php @@ -15,7 +15,7 @@ return array( 'password_resets_sent' => 'The selected users who are activated and have a valid email addresses have been sent a password reset link.', 'password_reset_sent' => 'A password reset link has been sent to :email!', 'user_has_no_email' => 'This user does not have an email address in their profile.', - 'user_has_no_assets_assigned' => 'This user does not have any assets assigned', + 'log_record_not_found' => 'A matching log record for this user could not be found.', 'success' => array( From 6d55d782806c9660e9e65dc5250faacb5d0033ed Mon Sep 17 00:00:00 2001 From: snipe Date: Mon, 9 Oct 2023 16:13:41 +0100 Subject: [PATCH 21/45] Set resend acceptance to POST Signed-off-by: snipe --- app/Http/Controllers/ReportsController.php | 16 +++++++++++++--- .../views/reports/unaccepted_assets.blade.php | 16 ++++++++++++++-- routes/web.php | 4 ++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index bacc27f423..4873c7f2a5 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -1043,27 +1043,37 @@ class ReportsController extends Controller * @throws \Illuminate\Auth\Access\AuthorizationException * @version v1.0 */ - public function sentAssetAcceptanceReminder($acceptanceId = null) + public function sentAssetAcceptanceReminder(Request $request) { $this->authorize('reports.view'); - if (!$acceptance = CheckoutAcceptance::pending()->find($acceptanceId)) { + if (!$acceptance = CheckoutAcceptance::pending()->find($request->input('acceptance_id'))) { + \Log::debug('No pending acceptances'); // Redirect to the unaccepted assets report page with error return redirect()->route('reports/unaccepted_assets')->with('error', trans('general.bad_data')); } + $assetItem = $acceptance->checkoutable; + \Log::debug(print_r($assetItem, true)); + if (is_null($acceptance->created_at)){ + \Log::debug('No acceptance created_at'); return redirect()->route('reports/unaccepted_assets')->with('error', trans('general.bad_data')); } else { $logItem_res = $assetItem->checkouts()->where('created_at', '=', $acceptance->created_at)->get(); + + \Log::debug('Acceptance created at: '.$acceptance->created_at); + \Log::debug(print_r($logItem_res, true)); + if ($logItem_res->isEmpty()){ + \Log::debug('Acceptance date mismatch'); return redirect()->route('reports/unaccepted_assets')->with('error', trans('general.bad_data')); } $logItem = $logItem_res[0]; } - if(!$assetItem->assignedTo->locale){ + if (!$assetItem->assignedTo->locale){ Notification::locale(Setting::getSettings()->locale)->send( $assetItem->assignedTo, new CheckoutAssetNotification($assetItem, $assetItem->assignedTo, $logItem->user, $acceptance, $logItem->note) diff --git a/resources/views/reports/unaccepted_assets.blade.php b/resources/views/reports/unaccepted_assets.blade.php index 37ae66ce30..80d151fd42 100644 --- a/resources/views/reports/unaccepted_assets.blade.php +++ b/resources/views/reports/unaccepted_assets.blade.php @@ -77,11 +77,23 @@ {!! $item['assetItem']->present()->nameUrl() !!} {{ $item['assetItem']->asset_tag }} assignedTo === null || $item['acceptance']->assignedTo->trashed()) style="text-decoration: line-through" @endif>{!! ($item['acceptance']->assignedTo) ? $item['acceptance']->assignedTo->present()->nameUrl() : trans('admin/reports/general.deleted_user') !!} - + + @if(!$item['acceptance']->trashed()) - @if ($item['acceptance']->assignedTo){{ trans('admin/reports/general.send_reminder') }}@endif + + @if ($item['acceptance']->assignedTo) + @csrf + + + + @endif + @endif + + @endif diff --git a/routes/web.php b/routes/web.php index 4bc8b3bb58..0aacf85135 100644 --- a/routes/web.php +++ b/routes/web.php @@ -368,8 +368,8 @@ Route::group(['middleware' => ['auth']], function () { 'reports/unaccepted_assets/{deleted?}', [ReportsController::class, 'getAssetAcceptanceReport'] )->name('reports/unaccepted_assets'); - Route::get( - 'reports/unaccepted_assets/{acceptanceId}/sent_reminder', + Route::post( + 'reports/unaccepted_assets/sent_reminder', [ReportsController::class, 'sentAssetAcceptanceReminder'] )->name('reports/unaccepted_assets_sent_reminder'); Route::delete( From 866bbe5e1149223baa265f8d04a2854dfb9bfa99 Mon Sep 17 00:00:00 2001 From: snipe Date: Mon, 9 Oct 2023 16:15:14 +0100 Subject: [PATCH 22/45] Removed extra debugging Signed-off-by: snipe --- app/Http/Controllers/ReportsController.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 4873c7f2a5..2791624216 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -1063,9 +1063,6 @@ class ReportsController extends Controller } else { $logItem_res = $assetItem->checkouts()->where('created_at', '=', $acceptance->created_at)->get(); - \Log::debug('Acceptance created at: '.$acceptance->created_at); - \Log::debug(print_r($logItem_res, true)); - if ($logItem_res->isEmpty()){ \Log::debug('Acceptance date mismatch'); return redirect()->route('reports/unaccepted_assets')->with('error', trans('general.bad_data')); From b9dc7f88d00a22cd477a3a2f2a6fc8e48a3553ac Mon Sep 17 00:00:00 2001 From: snipe Date: Mon, 9 Oct 2023 16:32:30 +0100 Subject: [PATCH 23/45] Fix qty requirements for Components API checkout Signed-off-by: snipe --- app/Http/Controllers/Api/ComponentsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/ComponentsController.php b/app/Http/Controllers/Api/ComponentsController.php index a6e3e379e3..9525bdbafc 100644 --- a/app/Http/Controllers/Api/ComponentsController.php +++ b/app/Http/Controllers/Api/ComponentsController.php @@ -263,7 +263,7 @@ class ComponentsController extends Controller } // Make sure there is at least one available to checkout - if ($component->numRemaining() <= $request->get('assigned_qty')) { + if ($component->numRemaining() < $request->get('assigned_qty')) { return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/components/message.checkout.unavailable', ['remaining' => $component->numRemaining(), 'requested' => $request->get('assigned_qty')]))); } From 0fbe63d0cf6b6c3e21ae113f3eec70d0c2dc56e9 Mon Sep 17 00:00:00 2001 From: snipe Date: Mon, 9 Oct 2023 16:33:00 +0100 Subject: [PATCH 24/45] Add @Singrity as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 41e7063e30..c10b080181 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -2961,6 +2961,15 @@ "contributions": [ "code" ] + }, + { + "login": "Singrity", + "name": "Bogdan", + "avatar_url": "https://avatars.githubusercontent.com/u/58479551?v=4", + "profile": "http://@singrity", + "contributions": [ + "code" + ] } ] } diff --git a/README.md b/README.md index c29cccb67b..3a74120b3d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![Crowdin](https://d322cqt584bo4o.cloudfront.net/snipe-it/localized.svg)](https://crowdin.com/project/snipe-it) [![Docker Pulls](https://img.shields.io/docker/pulls/snipe/snipe-it.svg)](https://hub.docker.com/r/snipe/snipe-it/) [![Twitter Follow](https://img.shields.io/twitter/follow/snipeitapp.svg?style=social)](https://twitter.com/snipeitapp) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/553ce52037fc43ea99149785afcfe641)](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade) -[![All Contributors](https://img.shields.io/badge/all_contributors-326-orange.svg?style=flat-square)](#contributors) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk) [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev) +[![All Contributors](https://img.shields.io/badge/all_contributors-327-orange.svg?style=flat-square)](#contributors) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/yZFtShAcKk) [![huntr](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev) ## Snipe-IT - Open Source Asset Management System @@ -145,7 +145,7 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken | [
Chris Hartjes](http://www.littlehart.net/atthekeyboard)
[💻](https://github.com/snipe/snipe-it/commits?author=chartjes "Code") | [
geo-chen](https://github.com/geo-chen)
[💻](https://github.com/snipe/snipe-it/commits?author=geo-chen "Code") | [
Phan Nguyen](https://github.com/nh314)
[💻](https://github.com/snipe/snipe-it/commits?author=nh314 "Code") | [
Iisakki Jaakkola](https://github.com/StarlessNights)
[💻](https://github.com/snipe/snipe-it/commits?author=StarlessNights "Code") | [
Ikko Ashimine](https://bandism.net/)
[💻](https://github.com/snipe/snipe-it/commits?author=eltociear "Code") | [
Lukas Fehling](https://github.com/lukasfehling)
[💻](https://github.com/snipe/snipe-it/commits?author=lukasfehling "Code") | [
Fernando Almeida](https://github.com/fernando-almeida)
[💻](https://github.com/snipe/snipe-it/commits?author=fernando-almeida "Code") | | [
akemidx](https://github.com/akemidx)
[💻](https://github.com/snipe/snipe-it/commits?author=akemidx "Code") | [
Oguz Bilgic](http://oguz.site)
[💻](https://github.com/snipe/snipe-it/commits?author=oguzbilgic "Code") | [
Scooter Crawford](https://github.com/scoo73r)
[💻](https://github.com/snipe/snipe-it/commits?author=scoo73r "Code") | [
subdriven](https://github.com/subdriven)
[💻](https://github.com/snipe/snipe-it/commits?author=subdriven "Code") | [
Andrew Savinykh](https://github.com/AndrewSav)
[💻](https://github.com/snipe/snipe-it/commits?author=AndrewSav "Code") | [
Tadayuki Onishi](https://kenchan0130.github.io)
[💻](https://github.com/snipe/snipe-it/commits?author=kenchan0130 "Code") | [
Florian](https://github.com/floschoepfer)
[💻](https://github.com/snipe/snipe-it/commits?author=floschoepfer "Code") | | [
Spencer Long](http://spencerlong.com)
[💻](https://github.com/snipe/snipe-it/commits?author=spencerrlongg "Code") | [
Marcus Moore](https://github.com/marcusmoore)
[💻](https://github.com/snipe/snipe-it/commits?author=marcusmoore "Code") | [
Martin Meredith](https://github.com/Mezzle)
| [
dboth](http://dboth.de)
[💻](https://github.com/snipe/snipe-it/commits?author=dboth "Code") | [
Zachary Fleck](https://github.com/zacharyfleck)
[💻](https://github.com/snipe/snipe-it/commits?author=zacharyfleck "Code") | [
VIKAAS-A](https://github.com/vikaas-cyper)
[💻](https://github.com/snipe/snipe-it/commits?author=vikaas-cyper "Code") | [
Abdul Kareem](https://github.com/ak-piracha)
[💻](https://github.com/snipe/snipe-it/commits?author=ak-piracha "Code") | -| [
NojoudAlshehri](https://github.com/NojoudAlshehri)
[💻](https://github.com/snipe/snipe-it/commits?author=NojoudAlshehri "Code") | [
Stefan Stidl](https://github.com/stefanstidlffg)
[💻](https://github.com/snipe/snipe-it/commits?author=stefanstidlffg "Code") | [
Quentin Aymard](https://github.com/qay21)
[💻](https://github.com/snipe/snipe-it/commits?author=qay21 "Code") | [
Grant Le Roux](https://github.com/cram42)
[💻](https://github.com/snipe/snipe-it/commits?author=cram42 "Code") | +| [
NojoudAlshehri](https://github.com/NojoudAlshehri)
[💻](https://github.com/snipe/snipe-it/commits?author=NojoudAlshehri "Code") | [
Stefan Stidl](https://github.com/stefanstidlffg)
[💻](https://github.com/snipe/snipe-it/commits?author=stefanstidlffg "Code") | [
Quentin Aymard](https://github.com/qay21)
[💻](https://github.com/snipe/snipe-it/commits?author=qay21 "Code") | [
Grant Le Roux](https://github.com/cram42)
[💻](https://github.com/snipe/snipe-it/commits?author=cram42 "Code") | [
Bogdan](http://@singrity)
[💻](https://github.com/snipe/snipe-it/commits?author=Singrity "Code") | This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome! From f685ba01b61319a6ced0d1d976a323173454199f Mon Sep 17 00:00:00 2001 From: snipe Date: Mon, 9 Oct 2023 16:43:14 +0100 Subject: [PATCH 25/45] Reversed order of find Signed-off-by: snipe --- .../Controllers/Accessories/AccessoriesFilesController.php | 2 +- app/Http/Controllers/Assets/AssetFilesController.php | 2 +- .../Controllers/Components/ComponentsFilesController.php | 2 +- .../Controllers/Consumables/ConsumablesFilesController.php | 2 +- app/Http/Controllers/Licenses/LicenseFilesController.php | 2 +- app/Http/Controllers/Users/UserFilesController.php | 7 ++++++- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Accessories/AccessoriesFilesController.php b/app/Http/Controllers/Accessories/AccessoriesFilesController.php index 939ab81260..6a94a897af 100644 --- a/app/Http/Controllers/Accessories/AccessoriesFilesController.php +++ b/app/Http/Controllers/Accessories/AccessoriesFilesController.php @@ -146,7 +146,7 @@ class AccessoriesFilesController extends Controller $this->authorize('view', $accessory); $this->authorize('accessories.files', $accessory); - if (! $log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $accessory->id)->first()) { + if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $accessory->id)->find($fileId)) { return redirect()->route('accessories.index')->with('error', trans('admin/users/message.log_record_not_found')); } diff --git a/app/Http/Controllers/Assets/AssetFilesController.php b/app/Http/Controllers/Assets/AssetFilesController.php index cfe8055bd6..610705c604 100644 --- a/app/Http/Controllers/Assets/AssetFilesController.php +++ b/app/Http/Controllers/Assets/AssetFilesController.php @@ -86,7 +86,7 @@ class AssetFilesController extends Controller if (isset($asset->id)) { $this->authorize('view', $asset); - if (! $log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $asset->id)->first()) { + if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $asset->id)->find($fileId)) { return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } diff --git a/app/Http/Controllers/Components/ComponentsFilesController.php b/app/Http/Controllers/Components/ComponentsFilesController.php index d46dc05f9c..0f4e782aa8 100644 --- a/app/Http/Controllers/Components/ComponentsFilesController.php +++ b/app/Http/Controllers/Components/ComponentsFilesController.php @@ -142,7 +142,7 @@ class ComponentsFilesController extends Controller $this->authorize('view', $component); $this->authorize('components.files', $component); - if (! $log = Actionlog::find($fileId)) { + if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $component->id)->find($fileId)) { return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } diff --git a/app/Http/Controllers/Consumables/ConsumablesFilesController.php b/app/Http/Controllers/Consumables/ConsumablesFilesController.php index 4d9d1d5f7d..6053e82cca 100644 --- a/app/Http/Controllers/Consumables/ConsumablesFilesController.php +++ b/app/Http/Controllers/Consumables/ConsumablesFilesController.php @@ -140,7 +140,7 @@ class ConsumablesFilesController extends Controller $this->authorize('view', $consumable); $this->authorize('consumables.files', $consumable); - if (! $log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $consumable->id)->first()) { + if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $consumable->id)->find($fileId)) { return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } diff --git a/app/Http/Controllers/Licenses/LicenseFilesController.php b/app/Http/Controllers/Licenses/LicenseFilesController.php index 83fbc04903..f6f7c1ad0c 100644 --- a/app/Http/Controllers/Licenses/LicenseFilesController.php +++ b/app/Http/Controllers/Licenses/LicenseFilesController.php @@ -137,7 +137,7 @@ class LicenseFilesController extends Controller $this->authorize('view', $license); $this->authorize('licenses.files', $license); - if (! $log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $license->id)->first()) { + if (! $log = Actionlog::whereNotNull('filename')->where('item_id', $license->id)->find($fileId)) { return response('No matching record for that asset/file', 500) ->header('Content-Type', 'text/plain'); } diff --git a/app/Http/Controllers/Users/UserFilesController.php b/app/Http/Controllers/Users/UserFilesController.php index d0778dd570..0b787306f9 100644 --- a/app/Http/Controllers/Users/UserFilesController.php +++ b/app/Http/Controllers/Users/UserFilesController.php @@ -136,6 +136,11 @@ class UserFilesController extends Controller */ public function show($userId = null, $fileId = null) { + + if (empty($fileId)) { + return redirect()->route('users.show')->with('error', 'Invalid file request'); + } + $user = User::find($userId); // the license is valid @@ -143,7 +148,7 @@ class UserFilesController extends Controller $this->authorize('view', $user); - if ($log = Actionlog::find($fileId)->whereNotNull('filename')->where('item_id', $user->id)->first()) { + if ($log = Actionlog::whereNotNull('filename')->where('item_id', $user->id)->find($fileId)) { // Display the file inline if (request('inline') == 'true') { From 47a77eabf2d85152f370d2daa15a70b5fc7d57d7 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 10 Oct 2023 15:06:08 -0700 Subject: [PATCH 26/45] Avoid logging error messages for webhook request failures --- app/Listeners/CheckoutableListener.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/Listeners/CheckoutableListener.php b/app/Listeners/CheckoutableListener.php index d9680f82a1..13579ce6b6 100644 --- a/app/Listeners/CheckoutableListener.php +++ b/app/Listeners/CheckoutableListener.php @@ -18,6 +18,7 @@ use App\Notifications\CheckoutAccessoryNotification; use App\Notifications\CheckoutAssetNotification; use App\Notifications\CheckoutConsumableNotification; use App\Notifications\CheckoutLicenseSeatNotification; +use GuzzleHttp\Exception\ClientException; use Illuminate\Support\Facades\Notification; use Exception; use Log; @@ -61,6 +62,16 @@ class CheckoutableListener ); } } catch (Exception $e) { + if ($e instanceof ClientException){ + $statusCode = $e->getResponse()->getStatusCode(); + // If status code is in 400 range, we don't want to log it as an error + // @todo: 300 and 500 as well? + if ($statusCode >= 400 && $statusCode < 500) { + Log::debug("Exception caught during checkout notification: ".$e->getMessage()); + return; + } + } + Log::error("Exception caught during checkout notification: ".$e->getMessage()); } } From ab3a3de59b64cd837f6d824f086a5749cdd60bf3 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 10 Oct 2023 15:13:46 -0700 Subject: [PATCH 27/45] Fire webhook notification after sending emails --- app/Listeners/CheckoutableListener.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Listeners/CheckoutableListener.php b/app/Listeners/CheckoutableListener.php index 13579ce6b6..917a037703 100644 --- a/app/Listeners/CheckoutableListener.php +++ b/app/Listeners/CheckoutableListener.php @@ -45,11 +45,6 @@ class CheckoutableListener $acceptance = $this->getCheckoutAcceptance($event); try { - if ($this->shouldSendWebhookNotification()) { - Notification::route('slack', Setting::getSettings()->webhook_endpoint) - ->notify($this->getCheckoutNotification($event)); - } - if (! $event->checkedOutTo->locale) { Notification::locale(Setting::getSettings()->locale)->send( $this->getNotifiables($event), @@ -61,6 +56,11 @@ class CheckoutableListener $this->getCheckoutNotification($event, $acceptance) ); } + + if ($this->shouldSendWebhookNotification()) { + Notification::route('slack', Setting::getSettings()->webhook_endpoint) + ->notify($this->getCheckoutNotification($event)); + } } catch (Exception $e) { if ($e instanceof ClientException){ $statusCode = $e->getResponse()->getStatusCode(); From 2a29566458521bf7a56b2a8ab2845268ac4590da Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 10 Oct 2023 15:15:02 -0700 Subject: [PATCH 28/45] Catch all ClientExceptions on check out --- app/Listeners/CheckoutableListener.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/app/Listeners/CheckoutableListener.php b/app/Listeners/CheckoutableListener.php index 917a037703..01e5041f67 100644 --- a/app/Listeners/CheckoutableListener.php +++ b/app/Listeners/CheckoutableListener.php @@ -63,13 +63,8 @@ class CheckoutableListener } } catch (Exception $e) { if ($e instanceof ClientException){ - $statusCode = $e->getResponse()->getStatusCode(); - // If status code is in 400 range, we don't want to log it as an error - // @todo: 300 and 500 as well? - if ($statusCode >= 400 && $statusCode < 500) { - Log::debug("Exception caught during checkout notification: ".$e->getMessage()); - return; - } + Log::debug("Exception caught during checkout notification: ".$e->getMessage()); + return; } Log::error("Exception caught during checkout notification: ".$e->getMessage()); From 9ef598d07bdaf6565ec79cf7078697e1634e56be Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 10 Oct 2023 15:16:12 -0700 Subject: [PATCH 29/45] Apply changes to exception handling for check outs to check ins --- app/Listeners/CheckoutableListener.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/Listeners/CheckoutableListener.php b/app/Listeners/CheckoutableListener.php index 01e5041f67..34d93550ed 100644 --- a/app/Listeners/CheckoutableListener.php +++ b/app/Listeners/CheckoutableListener.php @@ -98,11 +98,6 @@ class CheckoutableListener } try { - if ($this->shouldSendWebhookNotification()) { - Notification::route('slack', Setting::getSettings()->webhook_endpoint) - ->notify($this->getCheckinNotification($event)); - } - // Use default locale if (! $event->checkedOutTo->locale) { Notification::locale(Setting::getSettings()->locale)->send( @@ -115,7 +110,17 @@ class CheckoutableListener $this->getCheckinNotification($event) ); } + + if ($this->shouldSendWebhookNotification()) { + Notification::route('slack', Setting::getSettings()->webhook_endpoint) + ->notify($this->getCheckinNotification($event)); + } } catch (Exception $e) { + if ($e instanceof ClientException){ + Log::debug("Exception caught during checkout notification: ".$e->getMessage()); + return; + } + Log::error("Exception caught during checkin notification: ".$e->getMessage()); } } From dae9e6d09659a811c1c1d93548f3b501ff1deaf1 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 10 Oct 2023 15:18:37 -0700 Subject: [PATCH 30/45] Improve try catch blocks --- app/Listeners/CheckoutableListener.php | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/app/Listeners/CheckoutableListener.php b/app/Listeners/CheckoutableListener.php index 34d93550ed..ec51130b1a 100644 --- a/app/Listeners/CheckoutableListener.php +++ b/app/Listeners/CheckoutableListener.php @@ -42,7 +42,7 @@ class CheckoutableListener /** * Make a checkout acceptance and attach it in the notification */ - $acceptance = $this->getCheckoutAcceptance($event); + $acceptance = $this->getCheckoutAcceptance($event); try { if (! $event->checkedOutTo->locale) { @@ -61,12 +61,11 @@ class CheckoutableListener Notification::route('slack', Setting::getSettings()->webhook_endpoint) ->notify($this->getCheckoutNotification($event)); } - } catch (Exception $e) { - if ($e instanceof ClientException){ - Log::debug("Exception caught during checkout notification: ".$e->getMessage()); - return; - } - + } + catch (ClientException $e){ + Log::debug("Exception caught during checkout notification: ".$e->getMessage()); + } + catch (Exception $e) { Log::error("Exception caught during checkout notification: ".$e->getMessage()); } } @@ -115,12 +114,11 @@ class CheckoutableListener Notification::route('slack', Setting::getSettings()->webhook_endpoint) ->notify($this->getCheckinNotification($event)); } - } catch (Exception $e) { - if ($e instanceof ClientException){ - Log::debug("Exception caught during checkout notification: ".$e->getMessage()); - return; - } - + } + catch (ClientException $e){ + Log::debug("Exception caught during checkout notification: ".$e->getMessage()); + } + catch (Exception $e) { Log::error("Exception caught during checkin notification: ".$e->getMessage()); } } From 43b9e6401c62e8f99d46fe383b2aca1d45cbe08f Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 10 Oct 2023 15:18:55 -0700 Subject: [PATCH 31/45] Formatting --- app/Listeners/CheckoutableListener.php | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/app/Listeners/CheckoutableListener.php b/app/Listeners/CheckoutableListener.php index ec51130b1a..17a8a6c1bf 100644 --- a/app/Listeners/CheckoutableListener.php +++ b/app/Listeners/CheckoutableListener.php @@ -61,12 +61,10 @@ class CheckoutableListener Notification::route('slack', Setting::getSettings()->webhook_endpoint) ->notify($this->getCheckoutNotification($event)); } - } - catch (ClientException $e){ - Log::debug("Exception caught during checkout notification: ".$e->getMessage()); - } - catch (Exception $e) { - Log::error("Exception caught during checkout notification: ".$e->getMessage()); + } catch (ClientException $e) { + Log::debug("Exception caught during checkout notification: " . $e->getMessage()); + } catch (Exception $e) { + Log::error("Exception caught during checkout notification: " . $e->getMessage()); } } @@ -114,12 +112,10 @@ class CheckoutableListener Notification::route('slack', Setting::getSettings()->webhook_endpoint) ->notify($this->getCheckinNotification($event)); } - } - catch (ClientException $e){ - Log::debug("Exception caught during checkout notification: ".$e->getMessage()); - } - catch (Exception $e) { - Log::error("Exception caught during checkin notification: ".$e->getMessage()); + } catch (ClientException $e) { + Log::debug("Exception caught during checkout notification: " . $e->getMessage()); + } catch (Exception $e) { + Log::error("Exception caught during checkin notification: " . $e->getMessage()); } } From 417f9c21e42a179cf23890c62fdc11008b24c50b Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Tue, 10 Oct 2023 17:51:29 -0700 Subject: [PATCH 32/45] Fix the storing of group permissions when creating via API --- app/Http/Controllers/Api/GroupsController.php | 2 +- tests/Feature/Api/Groups/GroupStoreTest.php | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 tests/Feature/Api/Groups/GroupStoreTest.php diff --git a/app/Http/Controllers/Api/GroupsController.php b/app/Http/Controllers/Api/GroupsController.php index 7cc5d2d756..6dc7e83dd6 100644 --- a/app/Http/Controllers/Api/GroupsController.php +++ b/app/Http/Controllers/Api/GroupsController.php @@ -63,7 +63,7 @@ class GroupsController extends Controller $group = new Group; $group->name = $request->input('name'); - $group->permissions = $request->input('permissions'); // Todo - some JSON validation stuff here + $group->permissions = json_encode($request->input('permissions')); // Todo - some JSON validation stuff here if ($group->save()) { return response()->json(Helper::formatStandardApiResponse('success', $group, trans('admin/groups/message.create.success'))); diff --git a/tests/Feature/Api/Groups/GroupStoreTest.php b/tests/Feature/Api/Groups/GroupStoreTest.php new file mode 100644 index 0000000000..9ffba51913 --- /dev/null +++ b/tests/Feature/Api/Groups/GroupStoreTest.php @@ -0,0 +1,41 @@ +actingAsForApi(User::factory()->create()) + ->postJson(route('api.groups.store')) + ->assertForbidden(); + } + + public function testCanStoreGroup() + { + $this->actingAsForApi(User::factory()->superuser()->create()) + ->postJson(route('api.groups.store'), [ + 'name' => 'My Awesome Group', + 'permissions' => [ + 'admin' => '1', + 'import' => '1', + 'reports.view' => '0', + ], + ]) + ->assertOk(); + + $group = Group::where('name', 'My Awesome Group')->first(); + + $this->assertNotNull($group); + $this->assertEquals('1', $group->decodePermissions()['admin']); + $this->assertEquals('1', $group->decodePermissions()['import']); + $this->assertEquals('0', $group->decodePermissions()['reports.view']); + } +} From 9b53b0fedc53b011b23053228744c5265e17dd17 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Thu, 12 Oct 2023 14:50:12 -0500 Subject: [PATCH 33/45] resolve issue with migrations with table prefixes --- ...malized_eol_and_add_column_for_explicit_date_to_assets.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index 8bceca535e..ca067c3d4a 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -42,13 +42,13 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration } }); - DB::table('assets') + DB::table( 'assets') ->whereNull('asset_eol_date') ->whereNotNull('purchase_date') ->whereNotNull('model_id') ->join('models', 'assets.model_id', '=', 'models.id') ->update([ - 'asset_eol_date' => DB::raw('DATE_ADD(purchase_date, INTERVAL models.eol MONTH)') + 'asset_eol_date' => DB::raw('DATE_ADD(purchase_date, INTERVAL ' . DB::getTablePrefix() . 'models.eol MONTH)') ]); } From f3bd23da3da69bef2171d12e725d7a99305309ed Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Thu, 12 Oct 2023 14:53:17 -0500 Subject: [PATCH 34/45] rm whitespace --- ...ormalized_eol_and_add_column_for_explicit_date_to_assets.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index ca067c3d4a..8d3ca96829 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -42,7 +42,7 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration } }); - DB::table( 'assets') + DB::table('assets') ->whereNull('asset_eol_date') ->whereNotNull('purchase_date') ->whereNotNull('model_id') From c14a01eb8ba35a07caec89af875378d047a9ede3 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 13 Oct 2023 12:18:19 +0100 Subject: [PATCH 35/45] Added comments to explain the potential race condition Signed-off-by: snipe --- app/Observers/AssetObserver.php | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/app/Observers/AssetObserver.php b/app/Observers/AssetObserver.php index 3cbaedded2..55542ff2eb 100644 --- a/app/Observers/AssetObserver.php +++ b/app/Observers/AssetObserver.php @@ -120,17 +120,29 @@ class AssetObserver $logAction->user_id = Auth::id(); $logAction->logaction('delete'); } - + + /** + * Executes every time an asset is saved. + * + * This matters specifically because any database fields affected here MUST already exist on + * the assets table (and/or any related models), or related migrations WILL fail. + * + * For example, if there is a database migration that's a bit older and modifies an asset, if the save + * fires before a field gets created in a later migration and that field in the later migration + * is used in this observer, it doesn't actually exist yet and the migration will break. + * + * @see https://github.com/snipe/snipe-it/issues/13723#issuecomment-1761315938 + */ public function saving(Asset $asset) { - //determine if calculated eol and then calculate it - this should only happen on a new asset - if(is_null($asset->asset_eol_date) && !is_null($asset->purchase_date) && !is_null($asset->model->eol)){ + // determine if calculated eol and then calculate it - this should only happen on a new asset + if (is_null($asset->asset_eol_date) && !is_null($asset->purchase_date) && !is_null($asset->model->eol)){ $asset->asset_eol_date = $asset->purchase_date->addMonths($asset->model->eol)->format('Y-m-d'); $asset->eol_explicit = false; } - //determine if explicit and set eol_explit to true - if(!is_null($asset->asset_eol_date) && !is_null($asset->purchase_date)) { + // determine if explicit and set eol_explicit to true + if (!is_null($asset->asset_eol_date) && !is_null($asset->purchase_date)) { if($asset->model->eol) { $months = Carbon::parse($asset->asset_eol_date)->diffInMonths($asset->purchase_date); if($months != $asset->model->eol) { From 0b39591d882a263a106ffd8f80133f4959699f6d Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 13 Oct 2023 12:18:58 +0100 Subject: [PATCH 36/45] Add the eol_explicit column earlier to accomodate the observer Signed-off-by: snipe --- .../2023_01_21_225350_add_eol_date_on_assets_table.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php b/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php index 9f5c5aa1e5..fbd4688da2 100644 --- a/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php +++ b/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php @@ -20,6 +20,14 @@ class AddEolDateOnAssetsTable extends Migration if (!Schema::hasColumn('assets', 'asset_eol_date')) { $table->date('asset_eol_date')->after('purchase_date')->nullable()->default(null); } + + // This is a temporary shim so we don't have to modify the asset observer for migrations where + // there is a large version difference. (See the AssetObserver notes). This column gets created + // later in 2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php + // but we have to temporarily create it now so the save method below doesn't break + if (!Schema::hasColumn('assets', 'eol_explicit')) { + $table->boolean('eol_explicit')->default(false)->after('asset_eol_date'); + } }); // Chunk the model query to get the models that do have an EOL date From ea960c39bb5caa066495c71e071853cea161d94f Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 13 Oct 2023 12:19:32 +0100 Subject: [PATCH 37/45] Check if the eol_explicit column exists yet, add it if not Signed-off-by: snipe --- ...malized_eol_and_add_column_for_explicit_date_to_assets.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php index 8d3ca96829..982bd8ac0d 100644 --- a/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php +++ b/database/migrations/2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php @@ -18,7 +18,9 @@ class DenormalizedEolAndAddColumnForExplicitDateToAssets extends Migration public function up() { Schema::table('assets', function (Blueprint $table) { - $table->boolean('eol_explicit')->default(false)->after('asset_eol_date'); + if (!Schema::hasColumn('assets', 'eol_explicit')) { + $table->boolean('eol_explicit')->default(false)->after('asset_eol_date'); + } }); From b2aed7feeac598100134db8b7edceea4a5c58b94 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 13 Oct 2023 12:30:26 +0100 Subject: [PATCH 38/45] Removed temp column Signed-off-by: snipe --- .../2023_01_21_225350_add_eol_date_on_assets_table.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php b/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php index fbd4688da2..550f6f335b 100644 --- a/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php +++ b/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php @@ -20,14 +20,6 @@ class AddEolDateOnAssetsTable extends Migration if (!Schema::hasColumn('assets', 'asset_eol_date')) { $table->date('asset_eol_date')->after('purchase_date')->nullable()->default(null); } - - // This is a temporary shim so we don't have to modify the asset observer for migrations where - // there is a large version difference. (See the AssetObserver notes). This column gets created - // later in 2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php - // but we have to temporarily create it now so the save method below doesn't break - if (!Schema::hasColumn('assets', 'eol_explicit')) { - $table->boolean('eol_explicit')->default(false)->after('asset_eol_date'); - } }); // Chunk the model query to get the models that do have an EOL date @@ -37,7 +29,7 @@ class AddEolDateOnAssetsTable extends Migration if ($asset->purchase_date!='') { $asset->asset_eol_date = $asset->present()->eol_date(); - $asset->save(); + $asset->saveQuietly(); } } From 2537d0fdaf3c6a8bbd848c16b028e53200d211ba Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 13 Oct 2023 12:34:46 +0100 Subject: [PATCH 39/45] Added comments Signed-off-by: snipe --- app/Observers/AssetObserver.php | 3 ++- .../2023_01_21_225350_add_eol_date_on_assets_table.php | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Observers/AssetObserver.php b/app/Observers/AssetObserver.php index 55542ff2eb..c15c54a568 100644 --- a/app/Observers/AssetObserver.php +++ b/app/Observers/AssetObserver.php @@ -129,7 +129,8 @@ class AssetObserver * * For example, if there is a database migration that's a bit older and modifies an asset, if the save * fires before a field gets created in a later migration and that field in the later migration - * is used in this observer, it doesn't actually exist yet and the migration will break. + * is used in this observer, it doesn't actually exist yet and the migration will break unless we + * use saveQuietly() in the migration which skips this observer. * * @see https://github.com/snipe/snipe-it/issues/13723#issuecomment-1761315938 */ diff --git a/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php b/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php index 550f6f335b..d20d47d440 100644 --- a/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php +++ b/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php @@ -23,6 +23,8 @@ class AddEolDateOnAssetsTable extends Migration }); // Chunk the model query to get the models that do have an EOL date + // We use saveQuietly() here to skip the AssetObserver, since it modifies fields + // that do not yet exist on the assets table. AssetModel::whereNotNull('eol')->chunk(10, function ($models) { foreach ($models as $model) { foreach ($model->assets as $asset) { From ca1420c9bd326cbcaa8909417f8fda08fed467af Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 13 Oct 2023 12:39:28 +0100 Subject: [PATCH 40/45] Added the temp column back in Signed-off-by: snipe --- .../2023_01_21_225350_add_eol_date_on_assets_table.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php b/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php index d20d47d440..aa9086a7c7 100644 --- a/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php +++ b/database/migrations/2023_01_21_225350_add_eol_date_on_assets_table.php @@ -17,9 +17,18 @@ class AddEolDateOnAssetsTable extends Migration { Schema::table('assets', function (Blueprint $table) { + if (!Schema::hasColumn('assets', 'asset_eol_date')) { $table->date('asset_eol_date')->after('purchase_date')->nullable()->default(null); } + + // This is a temporary shim so we don't have to modify the asset observer for migrations where + // there is a large version difference. (See the AssetObserver notes). This column gets created + // later in 2023_07_13_052204_denormalized_eol_and_add_column_for_explicit_date_to_assets.php + // but we have to temporarily create it now so the save method below doesn't break + if (!Schema::hasColumn('assets', 'eol_explicit')) { + $table->boolean('eol_explicit')->default(false)->after('asset_eol_date'); + } }); // Chunk the model query to get the models that do have an EOL date From 93cccf4f5f22ba44aee96702ea362764c47fc0be Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 13 Oct 2023 19:32:09 +0100 Subject: [PATCH 41/45] Handle case where value is deleted in history Signed-off-by: snipe --- .../Transformers/ActionlogsTransformer.php | 59 ++++++++++++++++--- app/Models/Asset.php | 3 +- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/app/Http/Transformers/ActionlogsTransformer.php b/app/Http/Transformers/ActionlogsTransformer.php index 1cc105e6a9..b04a737da2 100644 --- a/app/Http/Transformers/ActionlogsTransformer.php +++ b/app/Http/Transformers/ActionlogsTransformer.php @@ -10,6 +10,8 @@ use App\Models\Supplier; use App\Models\Location; use App\Models\AssetModel; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Contracts\Encryption\DecryptException; +use Illuminate\Support\Facades\Crypt; class ActionlogsTransformer { @@ -69,9 +71,36 @@ class ActionlogsTransformer if ($custom_field->db_column == $fieldname) { - if ($custom_field->field_encrypted == '1') { - $clean_meta[$fieldname]['old'] = "************"; - $clean_meta[$fieldname]['new'] = "************"; + if ($custom_field->field_encrypted == '1') { + + // Unset these fields. We need to decrypt them, since even if the decrypted value + // didn't change, their value in the DB will, so we have to compare the unencrypted version + // to see if the values actually did change + unset($clean_meta[$fieldname]); + unset($clean_meta[$fieldname]); + + $enc_old = ''; + $enc_new = ''; + + try { + $enc_old = \Crypt::decryptString($this->clean_field($fieldata->old)); + } catch (\Exception $e) { + \Log::debug('Could not decrypt field - maybe the key changed?'); + } + + try { + $enc_new = \Crypt::decryptString($this->clean_field($fieldata->new)); + } catch (\Exception $e) { + \Log::debug('Could not decrypt field - maybe the key changed?'); + } + + if ($enc_old != $enc_new) { + \Log::debug('custom fields do not match'); + $clean_meta[$fieldname]['old'] = "************"; + $clean_meta[$fieldname]['new'] = "************"; + } + + } } @@ -178,15 +207,31 @@ class ActionlogsTransformer if(array_key_exists('rtd_location_id',$clean_meta)) { - $clean_meta['rtd_location_id']['old'] = $clean_meta['rtd_location_id']['old'] ? "[id: ".$clean_meta['rtd_location_id']['old']."] ". e($location->find($clean_meta['rtd_location_id']['old'])->name) : trans('general.unassigned'); - $clean_meta['rtd_location_id']['new'] = $clean_meta['rtd_location_id']['new'] ? "[id: ".$clean_meta['rtd_location_id']['new']."] ". e($location->find($clean_meta['rtd_location_id']['new'])->name) : trans('general.unassigned'); + + $oldRtd = $location->find($clean_meta['rtd_location_id']['old']); + $oldRtdName = $oldRtd ? e($oldRtd->name) : trans('general.deleted'); + + $newRtd = $location->find($clean_meta['rtd_location_id']['new']); + $newRtdName = $newRtd ? e($newRtd->name) : trans('general.deleted'); + + $clean_meta['rtd_location_id']['old'] = $clean_meta['rtd_location_id']['old'] ? "[id: ".$clean_meta['rtd_location_id']['old']."] ". $oldRtdName : 'foo'; + $clean_meta['rtd_location_id']['new'] = $clean_meta['rtd_location_id']['new'] ? "[id: ".$clean_meta['rtd_location_id']['new']."] ". $newRtdName : trans('general.unassigned'); $clean_meta['Default Location'] = $clean_meta['rtd_location_id']; unset($clean_meta['rtd_location_id']); } + if (array_key_exists('location_id', $clean_meta)) { - $clean_meta['location_id']['old'] = $clean_meta['location_id']['old'] ? "[id: ".$clean_meta['location_id']['old']."] ".e($location->find($clean_meta['location_id']['old'])->name): trans('general.unassigned'); - $clean_meta['location_id']['new'] = $clean_meta['location_id']['new'] ? "[id: ".$clean_meta['location_id']['new']."] ".e($location->find($clean_meta['location_id']['new'])->name) : trans('general.unassigned'); + + $oldLocation = $location->find($clean_meta['location_id']['old']); + $oldLocationName = $oldLocation ? e($oldLocation->name) : trans('general.deleted'); + + $newLocation = $location->find($clean_meta['location_id']['new']); + $newLocationName = $newLocation ? e($newLocation->name) : trans('general.deleted'); + + + $clean_meta['location_id']['old'] = $clean_meta['location_id']['old'] ? "[id: ".$clean_meta['location_id']['old']."] ". $oldLocationName : trans('general.deleted'); + $clean_meta['location_id']['new'] = $clean_meta['location_id']['new'] ? "[id: ".$clean_meta['location_id']['new']."] ". $newLocationName : trans('general.unassigned'); $clean_meta['Current Location'] = $clean_meta['location_id']; unset($clean_meta['location_id']); } diff --git a/app/Models/Asset.php b/app/Models/Asset.php index e2ffb7ee99..1ce38bca01 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -72,8 +72,7 @@ class Asset extends Depreciable protected $casts = [ 'purchase_date' => 'date', - 'asset_eol_date' => 'date', - 'eol_explicit' => 'boolean', + 'eol_explicit' => 'boolean', 'last_checkout' => 'datetime', 'last_checkin' => 'datetime', 'expected_checkin' => 'date', From 8f23a45cb3467872267fb65cbc8fdc9df14dcaec Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 13 Oct 2023 19:49:03 +0100 Subject: [PATCH 42/45] Removed dummy text Signed-off-by: snipe --- app/Http/Transformers/ActionlogsTransformer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Transformers/ActionlogsTransformer.php b/app/Http/Transformers/ActionlogsTransformer.php index b04a737da2..403662f47b 100644 --- a/app/Http/Transformers/ActionlogsTransformer.php +++ b/app/Http/Transformers/ActionlogsTransformer.php @@ -214,7 +214,7 @@ class ActionlogsTransformer $newRtd = $location->find($clean_meta['rtd_location_id']['new']); $newRtdName = $newRtd ? e($newRtd->name) : trans('general.deleted'); - $clean_meta['rtd_location_id']['old'] = $clean_meta['rtd_location_id']['old'] ? "[id: ".$clean_meta['rtd_location_id']['old']."] ". $oldRtdName : 'foo'; + $clean_meta['rtd_location_id']['old'] = $clean_meta['rtd_location_id']['old'] ? "[id: ".$clean_meta['rtd_location_id']['old']."] ". $oldRtdName : ''; $clean_meta['rtd_location_id']['new'] = $clean_meta['rtd_location_id']['new'] ? "[id: ".$clean_meta['rtd_location_id']['new']."] ". $newRtdName : trans('general.unassigned'); $clean_meta['Default Location'] = $clean_meta['rtd_location_id']; unset($clean_meta['rtd_location_id']); From a92a9d76166ff5f16e504f3f4781d9e599811615 Mon Sep 17 00:00:00 2001 From: snipe Date: Fri, 13 Oct 2023 19:53:11 +0100 Subject: [PATCH 43/45] Removed duplicated deleted Signed-off-by: snipe --- app/Http/Transformers/ActionlogsTransformer.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Transformers/ActionlogsTransformer.php b/app/Http/Transformers/ActionlogsTransformer.php index 403662f47b..d3af3bb753 100644 --- a/app/Http/Transformers/ActionlogsTransformer.php +++ b/app/Http/Transformers/ActionlogsTransformer.php @@ -215,7 +215,7 @@ class ActionlogsTransformer $newRtdName = $newRtd ? e($newRtd->name) : trans('general.deleted'); $clean_meta['rtd_location_id']['old'] = $clean_meta['rtd_location_id']['old'] ? "[id: ".$clean_meta['rtd_location_id']['old']."] ". $oldRtdName : ''; - $clean_meta['rtd_location_id']['new'] = $clean_meta['rtd_location_id']['new'] ? "[id: ".$clean_meta['rtd_location_id']['new']."] ". $newRtdName : trans('general.unassigned'); + $clean_meta['rtd_location_id']['new'] = $clean_meta['rtd_location_id']['new'] ? "[id: ".$clean_meta['rtd_location_id']['new']."] ". $newRtdName : ''; $clean_meta['Default Location'] = $clean_meta['rtd_location_id']; unset($clean_meta['rtd_location_id']); } @@ -230,8 +230,8 @@ class ActionlogsTransformer $newLocationName = $newLocation ? e($newLocation->name) : trans('general.deleted'); - $clean_meta['location_id']['old'] = $clean_meta['location_id']['old'] ? "[id: ".$clean_meta['location_id']['old']."] ". $oldLocationName : trans('general.deleted'); - $clean_meta['location_id']['new'] = $clean_meta['location_id']['new'] ? "[id: ".$clean_meta['location_id']['new']."] ". $newLocationName : trans('general.unassigned'); + $clean_meta['location_id']['old'] = $clean_meta['location_id']['old'] ? "[id: ".$clean_meta['location_id']['old']."] ". $oldLocationName : ''; + $clean_meta['location_id']['new'] = $clean_meta['location_id']['new'] ? "[id: ".$clean_meta['location_id']['new']."] ". $newLocationName : ''; $clean_meta['Current Location'] = $clean_meta['location_id']; unset($clean_meta['location_id']); } From 752171d5b8d60cf60431740db6ac6d5a28044bec Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Oct 2023 20:39:52 +0100 Subject: [PATCH 44/45] Use singleton for offset Signed-off-by: snipe --- app/Http/Controllers/Api/AssetsController.php | 2 +- app/Http/Controllers/Api/CategoriesController.php | 2 +- app/Http/Controllers/Api/CompaniesController.php | 2 +- app/Http/Controllers/Api/ComponentsController.php | 2 +- app/Http/Controllers/Api/ConsumablesController.php | 2 +- app/Http/Controllers/Api/DepartmentsController.php | 2 +- .../Controllers/Api/DepreciationsController.php | 2 +- app/Http/Controllers/Api/GroupsController.php | 2 +- app/Http/Controllers/Api/LicenseSeatsController.php | 2 +- app/Http/Controllers/Api/LicensesController.php | 2 +- app/Http/Controllers/Api/LocationsController.php | 2 +- .../Controllers/Api/ManufacturersController.php | 2 +- .../Controllers/Api/PredefinedKitsController.php | 2 +- app/Http/Controllers/Api/ReportsController.php | 2 +- app/Http/Controllers/Api/StatuslabelsController.php | 2 +- app/Http/Controllers/Api/SuppliersController.php | 2 +- app/Http/Controllers/Api/UsersController.php | 2 +- app/Providers/SettingsServiceProvider.php | 13 +++++++++++++ 18 files changed, 30 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 39b5ee238e..e49edc4db4 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -346,7 +346,7 @@ class AssetsController extends Controller // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $assets->count()) ? $assets->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $assets->count()) ? $assets->count() : app('api_offset_value'); $limit = app('api_limit_value'); $total = $assets->count(); diff --git a/app/Http/Controllers/Api/CategoriesController.php b/app/Http/Controllers/Api/CategoriesController.php index 2781fa101f..2aa4b3741c 100644 --- a/app/Http/Controllers/Api/CategoriesController.php +++ b/app/Http/Controllers/Api/CategoriesController.php @@ -92,7 +92,7 @@ class CategoriesController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $categories->count()) ? $categories->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $categories->count()) ? $categories->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/CompaniesController.php b/app/Http/Controllers/Api/CompaniesController.php index 42b5302448..580bc5d9b9 100644 --- a/app/Http/Controllers/Api/CompaniesController.php +++ b/app/Http/Controllers/Api/CompaniesController.php @@ -56,7 +56,7 @@ class CompaniesController extends Controller // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $companies->count()) ? $companies->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $companies->count()) ? $companies->count() : app('api_offset_value'); $limit = app('api_limit_value'); diff --git a/app/Http/Controllers/Api/ComponentsController.php b/app/Http/Controllers/Api/ComponentsController.php index 9525bdbafc..9202b10b71 100644 --- a/app/Http/Controllers/Api/ComponentsController.php +++ b/app/Http/Controllers/Api/ComponentsController.php @@ -77,7 +77,7 @@ class ComponentsController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $components->count()) ? $components->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $components->count()) ? $components->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/ConsumablesController.php b/app/Http/Controllers/Api/ConsumablesController.php index ba7e6fb302..b9b48328f5 100644 --- a/app/Http/Controllers/Api/ConsumablesController.php +++ b/app/Http/Controllers/Api/ConsumablesController.php @@ -86,7 +86,7 @@ class ConsumablesController extends Controller // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $consumables->count()) ? $consumables->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $consumables->count()) ? $consumables->count() : app('api_offset_value'); $limit = app('api_limit_value'); $allowed_columns = ['id', 'name', 'order_number', 'min_amt', 'purchase_date', 'purchase_cost', 'company', 'category', 'model_number', 'item_no', 'manufacturer', 'location', 'qty', 'image']; diff --git a/app/Http/Controllers/Api/DepartmentsController.php b/app/Http/Controllers/Api/DepartmentsController.php index d152d0a507..f211089b93 100644 --- a/app/Http/Controllers/Api/DepartmentsController.php +++ b/app/Http/Controllers/Api/DepartmentsController.php @@ -61,7 +61,7 @@ class DepartmentsController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $departments->count()) ? $departments->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $departments->count()) ? $departments->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/DepreciationsController.php b/app/Http/Controllers/Api/DepreciationsController.php index 3d86c1b096..502a0741b7 100644 --- a/app/Http/Controllers/Api/DepreciationsController.php +++ b/app/Http/Controllers/Api/DepreciationsController.php @@ -29,7 +29,7 @@ class DepreciationsController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $depreciations->count()) ? $depreciations->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $depreciations->count()) ? $depreciations->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/GroupsController.php b/app/Http/Controllers/Api/GroupsController.php index 6dc7e83dd6..8548af0ba5 100644 --- a/app/Http/Controllers/Api/GroupsController.php +++ b/app/Http/Controllers/Api/GroupsController.php @@ -36,7 +36,7 @@ class GroupsController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $groups->count()) ? $groups->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $groups->count()) ? $groups->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/LicenseSeatsController.php b/app/Http/Controllers/Api/LicenseSeatsController.php index a091741e85..5e79c49b23 100644 --- a/app/Http/Controllers/Api/LicenseSeatsController.php +++ b/app/Http/Controllers/Api/LicenseSeatsController.php @@ -41,7 +41,7 @@ class LicenseSeatsController extends Controller $total = $seats->count(); // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $seats->count()) ? $seats->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $seats->count()) ? $seats->count() : app('api_offset_value'); if ($offset >= $total ){ $offset = 0; diff --git a/app/Http/Controllers/Api/LicensesController.php b/app/Http/Controllers/Api/LicensesController.php index e021fc3d3e..d456e3cd64 100644 --- a/app/Http/Controllers/Api/LicensesController.php +++ b/app/Http/Controllers/Api/LicensesController.php @@ -95,7 +95,7 @@ class LicensesController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $licenses->count()) ? $licenses->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $licenses->count()) ? $licenses->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/LocationsController.php b/app/Http/Controllers/Api/LocationsController.php index 87bc266217..b888493286 100644 --- a/app/Http/Controllers/Api/LocationsController.php +++ b/app/Http/Controllers/Api/LocationsController.php @@ -81,7 +81,7 @@ class LocationsController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $locations->count()) ? $locations->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $locations->count()) ? $locations->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/ManufacturersController.php b/app/Http/Controllers/Api/ManufacturersController.php index 9ff0a0c202..dadef87e26 100644 --- a/app/Http/Controllers/Api/ManufacturersController.php +++ b/app/Http/Controllers/Api/ManufacturersController.php @@ -62,7 +62,7 @@ class ManufacturersController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $manufacturers->count()) ? $manufacturers->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $manufacturers->count()) ? $manufacturers->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/PredefinedKitsController.php b/app/Http/Controllers/Api/PredefinedKitsController.php index 85d05c422e..b398dbfae2 100644 --- a/app/Http/Controllers/Api/PredefinedKitsController.php +++ b/app/Http/Controllers/Api/PredefinedKitsController.php @@ -30,7 +30,7 @@ class PredefinedKitsController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $kits->count()) ? $kits->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $kits->count()) ? $kits->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'desc' ? 'desc' : 'asc'; diff --git a/app/Http/Controllers/Api/ReportsController.php b/app/Http/Controllers/Api/ReportsController.php index 21294c5779..7335e7d8e0 100644 --- a/app/Http/Controllers/Api/ReportsController.php +++ b/app/Http/Controllers/Api/ReportsController.php @@ -56,7 +56,7 @@ class ReportsController extends Controller // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $actionlogs->count()) ? $actionlogs->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $actionlogs->count()) ? $actionlogs->count() : app('api_offset_value'); $limit = app('api_limit_value'); $sort = in_array($request->input('sort'), $allowed_columns) ? e($request->input('sort')) : 'created_at'; diff --git a/app/Http/Controllers/Api/StatuslabelsController.php b/app/Http/Controllers/Api/StatuslabelsController.php index 30a0b699e9..7c8e260c2f 100644 --- a/app/Http/Controllers/Api/StatuslabelsController.php +++ b/app/Http/Controllers/Api/StatuslabelsController.php @@ -52,7 +52,7 @@ class StatuslabelsController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $statuslabels->count()) ? $statuslabels->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $statuslabels->count()) ? $statuslabels->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/SuppliersController.php b/app/Http/Controllers/Api/SuppliersController.php index ad1227cc83..3e3d637be0 100644 --- a/app/Http/Controllers/Api/SuppliersController.php +++ b/app/Http/Controllers/Api/SuppliersController.php @@ -94,7 +94,7 @@ class SuppliersController extends Controller } // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $suppliers->count()) ? $suppliers->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $suppliers->count()) ? $suppliers->count() : app('api_offset_value'); $limit = app('api_limit_value'); $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 64d942fb9d..5a2cd7dcf1 100644 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -192,7 +192,7 @@ class UsersController extends Controller $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; // Make sure the offset and limit are actually integers and do not exceed system limits - $offset = ($request->input('offset') > $users->count()) ? $users->count() : abs($request->input('offset')); + $offset = ($request->input('offset') > $users->count()) ? $users->count() : app('api_offset_value'); $limit = app('api_limit_value'); diff --git a/app/Providers/SettingsServiceProvider.php b/app/Providers/SettingsServiceProvider.php index 6656f284e0..bed653783a 100644 --- a/app/Providers/SettingsServiceProvider.php +++ b/app/Providers/SettingsServiceProvider.php @@ -38,15 +38,28 @@ class SettingsServiceProvider extends ServiceProvider if ((abs($int_limit) > 0) && ($int_limit <= config('app.max_results'))) { $limit = abs($int_limit); } + \Log::debug('Max in env: '.config('app.max_results')); \Log::debug('Original requested limit: '.request('limit')); \Log::debug('Int limit: '.$int_limit); \Log::debug('Modified limit: '.$limit); \Log::debug('------------------------------'); + return $limit; }); + // Make sure the offset is actually set and is an integer + \App::singleton('api_offset_value', function () { + $offset = intval(request('offset')); + \Log::debug('Original requested offset: '.request('offset')); + \Log::debug('Modified offset: '.$offset); + \Log::debug('------------------------------'); + + + return $offset; + }); + /** * Set some common variables so that they're globally available. From 199cdf68994d88a6322cf2798e18794630e686a2 Mon Sep 17 00:00:00 2001 From: snipe Date: Sat, 14 Oct 2023 20:43:18 +0100 Subject: [PATCH 45/45] Commented out noisy debugging Signed-off-by: snipe --- app/Providers/SettingsServiceProvider.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/Providers/SettingsServiceProvider.php b/app/Providers/SettingsServiceProvider.php index bed653783a..41dd80b4fc 100644 --- a/app/Providers/SettingsServiceProvider.php +++ b/app/Providers/SettingsServiceProvider.php @@ -39,11 +39,11 @@ class SettingsServiceProvider extends ServiceProvider $limit = abs($int_limit); } - \Log::debug('Max in env: '.config('app.max_results')); - \Log::debug('Original requested limit: '.request('limit')); - \Log::debug('Int limit: '.$int_limit); - \Log::debug('Modified limit: '.$limit); - \Log::debug('------------------------------'); +// \Log::debug('Max in env: '.config('app.max_results')); +// \Log::debug('Original requested limit: '.request('limit')); +// \Log::debug('Int limit: '.$int_limit); +// \Log::debug('Modified limit: '.$limit); +// \Log::debug('------------------------------'); return $limit; @@ -52,9 +52,9 @@ class SettingsServiceProvider extends ServiceProvider // Make sure the offset is actually set and is an integer \App::singleton('api_offset_value', function () { $offset = intval(request('offset')); - \Log::debug('Original requested offset: '.request('offset')); - \Log::debug('Modified offset: '.$offset); - \Log::debug('------------------------------'); +// \Log::debug('Original requested offset: '.request('offset')); +// \Log::debug('Modified offset: '.$offset); +// \Log::debug('------------------------------'); return $offset;