From 6fd36822bb07dfba6870ae372a3b71af66eb1478 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 10 Dec 2023 23:07:50 +0000 Subject: [PATCH] Add INL Sweep advantest-R6581T-781T0050---datron-4805-XANS1---TEST3.csv --- .../datron-4805-XANS1/README.md | 3 + .../datron-4805-XANS1/data/INLV-AdvDat.py | 175 ++++++++++++++++++ ...T-781T0050---datron-4805-XANS1---TEST3.csv | 73 ++++++++ ...T-781T0050---datron-4805-XANS1---TEST3.jpg | Bin 0 -> 22514 bytes 4 files changed, 251 insertions(+) create mode 100644 advantest-R6581T-781T0050/datron-4805-XANS1/README.md create mode 100644 advantest-R6581T-781T0050/datron-4805-XANS1/data/INLV-AdvDat.py create mode 100644 advantest-R6581T-781T0050/datron-4805-XANS1/data/advantest-R6581T-781T0050---datron-4805-XANS1---TEST3.csv create mode 100644 advantest-R6581T-781T0050/datron-4805-XANS1/data/advantest-R6581T-781T0050---datron-4805-XANS1---TEST3.jpg diff --git a/advantest-R6581T-781T0050/datron-4805-XANS1/README.md b/advantest-R6581T-781T0050/datron-4805-XANS1/README.md new file mode 100644 index 0000000..3fdc203 --- /dev/null +++ b/advantest-R6581T-781T0050/datron-4805-XANS1/README.md @@ -0,0 +1,3 @@ +| Meter Manufacturer | Meter Model | Meter SerialNumber | Source Manufacturer | Source Model | Source SerialNumber | MinMax | File | ID | User | +|--------------------|-------------|--------------------|---------------------|--------------|---------------------|--------|------|----|------| +|advantest|R6581T|781T0050|datron|4805|XANS1|0.0|/data/advantest-R6581T-781T0050---datron-4805-XANS1---TEST3.jpg|TEST3|xans| diff --git a/advantest-R6581T-781T0050/datron-4805-XANS1/data/INLV-AdvDat.py b/advantest-R6581T-781T0050/datron-4805-XANS1/data/INLV-AdvDat.py new file mode 100644 index 0000000..3fd9248 --- /dev/null +++ b/advantest-R6581T-781T0050/datron-4805-XANS1/data/INLV-AdvDat.py @@ -0,0 +1,175 @@ +import GPIBPrologix +import bme280 +import smbus2 +from requests import post + +## Initialize GPIB adapter +GPIB = GPIBPrologix.ResourceManager("/dev/ttyACM0") +# Connect equipment +inst2 = GPIB.open_resource(30) +inst3 = GPIB.open_resource(16) +# Initialize BME280 temperature/humidity sensor +bus = smbus2.SMBus(1) +## Configure equipment +# BME280 temperature/humidity sensor +calibration_params = bme280.load_calibration_params(bus, 0x76) + +# Datron 4805 Calibrator +inst2.query("F0=") #DCV +inst2.query("R6=") #10/100K Range +inst2.query("S0=") #LocalSense +inst2.query("M0.0069=") #6.9mV Out, sanity check +inst2.query("O1=") #OutputON +# Advantest R6581T +inst3.query("*RST") +inst3.query(":CONF:VOLT:DC") +inst3.query(":SENS:VOLT:NPLC 100") +inst3.query(":SENS:VOLT:DIG MAX") +inst3.query(":SENS:VOLT:RANG 10") +inst3.query(":ZERO:AUTO ON") + +# Measurement functions +def readValue(instObj): + value = instObj.query("FETch?") + return value +def setValue(instObj, inputVar): + instObj.query("M"+str(inputVar)+"=") + return inputVar +def getEnvironment(instObj, i2cbus): + value = instObj.sample(i2cbus, 0x76, calibration_params) + return value + +## Have gitpython pull in the repository +import os +import git +import shutil +username = input("Your 0xC6 git username: ") +password = input("Your 0xC6 git password: ") +remote = f"https://{username}:{password}@git.0xc6.com/xans/INL-Measurements.git" +if not os.path.exists(os.getcwd()+"/INL-Measurements"): + git.Repo.clone_from(remote, os.getcwd()+"/INL-Measurements/") +else: + shutil.rmtree(os.getcwd()+"/INL-Measurements/", ignore_errors=True) + git.Repo.clone_from(remote, os.getcwd()+"/INL-Measurements/") + +## Get needed info to properly label everything +MeterManufacturer = input("Meter Manufacturer: ").lower() +MeterModel = input("Meter Model: ").upper() +MeterSN = input("Meter SN: ").upper() +SourceManufacturer = input("Source Manufacturer: ").lower() +SourceModel = input("Source Model: ").upper() +SourceSN = input("Source SN: ").upper() +measid = input("Personally assigned measurement ID: ").upper() +shellyIp = input("If you use shelly for protection, enter the IP: ").upper() + +if shellyIp and os.system("ping -c 1 " + shellyIp): + print("shelly not found") + quit() +if shellyIp: + url = "{}://{}:{}/relay/0?turn=on".format("http", "192.168.0.101", "80") + post(url) + +## Create proper directory structure +basePath = os.getcwd() + "/INL-Measurements/" +dutname = MeterManufacturer+'-'+MeterModel+'-'+MeterSN +if not os.path.exists(basePath+dutname): + os.makedirs(basePath+dutname) +sourcename = SourceManufacturer+'-'+SourceModel+'-'+SourceSN +if not os.path.exists(basePath+dutname+'/'+sourcename): + os.makedirs(basePath+dutname+'/'+sourcename) +if not os.path.exists(basePath+dutname+'/'+sourcename+"/data/"): + os.makedirs(basePath+dutname+'/'+sourcename+"/data/") +basePath = basePath+dutname+'/'+sourcename +print(basePath+"/data/") + +import csv +import time +import datetime +import numpy as np +import pandas as pd +from math import sin +## Create logfile +logFileName = MeterManufacturer+'-'+MeterModel+'-'+MeterSN+'---'+SourceManufacturer+'-'+SourceModel+'-'+SourceSN+'---'+measid+'.csv' +with open(basePath+"/data/"+logFileName, 'a') as f: + writer = csv.writer(f) + writer.writerow(["DateTime","Set Volts","Measured Volts","Env Pressure","Env Temperature", "Env Humidity"]) +print(basePath+"/data/"+logFileName) + +sweep = np.arange(-12,0,0.5) + +cntr = 0 +d = datetime.datetime.now() +dlast = datetime.datetime.now() +## Collect data +time.sleep(60) +for x in sweep: + cntr = cntr + 1 + try: + #Set volt and let accimatize + setPoint = setValue(inst2,round(x,5)) + timebetween = (d-dlast) * (len(sweep)-cntr) + dlast = d + print(str(cntr)+'/'+str(len(sweep))+' Estimated Time Left: '+str(timebetween)) + time.sleep(10) + for i in range(3): + try: + time.sleep(5) + #Get DUT value + readout = readValue(inst3) + #Get envirnmental values + data = getEnvironment(bme280, bus) + #Write to file + d = datetime.datetime.now() + dx = d - datetime.timedelta(microseconds=d.microsecond) + fields=[dx.strftime("%d-%m-%y %H:%M:%S"),setPoint,float(readout),round(data.humidity,2),round(data.temperature,2),round(data.pressure,2)] + print(fields) + with open(basePath+"/data/"+logFileName, 'a') as f: + writer = csv.writer(f) + writer.writerow(fields) + if shellyIp and float(data.temperature) > 30 or float(data.temperature) < 16: + url = "{}://{}:{}/relay/0?turn=off".format("http", "192.168.0.101", "80") + post(url) + except Exception as e: + time.sleep(15) + i = i-1 + except Exception as e: + print(e) + time.sleep(1) + +## Calculate high order polynomial +df = pd.read_csv(basePath+"/data/"+logFileName) +df = df.groupby(["Set Volts"], as_index=False).mean(numeric_only=False) +highOrderPolyFit = np.polyfit(df["Set Volts"], df["Set Volts"]-df["Measured Volts"], 35) +trendPoly = np.poly1d(highOrderPolyFit) +## Make plot and save +import sys +from matplotlib import pyplot as plt +plt.plot(df["Set Volts"], df["Set Volts"]-df["Measured Volts"]) +polyIndex = np.arange(-11.9,0.1,0.01) +plt.plot(polyIndex, trendPoly(polyIndex)) +plt.xlabel('Source Voltage') +plt.ylabel('Delta Set/Meas') +plt.title ('INLV sweep '+ logFileName[:-4]) +plt.savefig(basePath+"/data/"+logFileName[:-4]+".jpg", bbox_inches='tight') + +minVal = trendPoly(polyIndex) +maxVal = trendPoly(polyIndex) +minVal = min(minVal) +maxVal = min(maxVal) +## Write away values to result overview +if not os.path.exists(basePath+'/README.md'): + with open(basePath+'/README.md', 'a') as f: + f.write("| Meter Manufacturer | Meter Model | Meter SerialNumber | Source Manufacturer | Source Model | Source SerialNumber | MinMax | File | ID | User |\n") + f.write("|--------------------|-------------|--------------------|---------------------|--------------|---------------------|--------|------|----|------|\n") + f.close() +with open(basePath+'/README.md', 'a') as f: + linkToImg = "/data/"+logFileName[:-4]+".jpg" + print("|"+MeterManufacturer+"|"+MeterModel+"|"+MeterSN+"|"+SourceManufacturer+"|"+SourceModel+"|"+SourceSN+"|"+str(round((maxVal-minVal),10))+"|"+linkToImg+"|"+measid+"|"+username+"|\n") + f.write("|"+MeterManufacturer+"|"+MeterModel+"|"+MeterSN+"|"+SourceManufacturer+"|"+SourceModel+"|"+SourceSN+"|"+str(round((maxVal-minVal),10))+"|"+linkToImg+"|"+measid+"|"+username+"|\n") + f.close() + shutil.copy(os.getcwd()+'/'+sys.argv[0],basePath+"/data/") + repo = git.Repo(os.getcwd() + "/INL-Measurements/") + repo.git.add(basePath) + repo.index.commit("Add INL Sweep "+ logFileName) + repo.remotes[0].push() + diff --git a/advantest-R6581T-781T0050/datron-4805-XANS1/data/advantest-R6581T-781T0050---datron-4805-XANS1---TEST3.csv b/advantest-R6581T-781T0050/datron-4805-XANS1/data/advantest-R6581T-781T0050---datron-4805-XANS1---TEST3.csv new file mode 100644 index 0000000..53913b1 --- /dev/null +++ b/advantest-R6581T-781T0050/datron-4805-XANS1/data/advantest-R6581T-781T0050---datron-4805-XANS1---TEST3.csv @@ -0,0 +1,73 @@ +DateTime,Set Volts,Measured Volts,Env Pressure,Env Temperature,Env Humidity +10-12-23 22:57:37,-12.0,-11.9999804,61.2,19.11,999.41 +10-12-23 22:57:42,-12.0,-11.9999816,61.16,19.1,999.45 +10-12-23 22:57:47,-12.0,-11.9999831,61.11,19.09,999.34 +10-12-23 22:58:03,-11.5,-11.4999845,61.13,19.08,999.42 +10-12-23 22:58:09,-11.5,-11.4999847,61.13,19.1,999.4 +10-12-23 22:58:14,-11.5,-11.4999853,61.07,19.08,999.34 +10-12-23 22:58:30,-11.0,-10.9999868,61.08,19.08,999.4 +10-12-23 22:58:35,-11.0,-10.9999867,61.08,19.1,999.5 +10-12-23 22:58:40,-11.0,-10.999987,61.1,19.08,999.44 +10-12-23 22:58:56,-10.5,-10.4999856,61.1,19.08,999.44 +10-12-23 22:59:01,-10.5,-10.4999856,61.11,19.09,999.38 +10-12-23 22:59:06,-10.5,-10.4999855,61.1,19.07,999.41 +10-12-23 22:59:22,-10.0,-9.9999864,61.13,19.07,999.45 +10-12-23 22:59:27,-10.0,-9.9999868,61.16,19.06,999.46 +10-12-23 22:59:32,-10.0,-9.9999868,61.19,19.06,999.42 +10-12-23 22:59:48,-9.5,-9.4999863,61.21,19.05,999.47 +10-12-23 22:59:53,-9.5,-9.4999866,61.2,19.04,999.4 +10-12-23 22:59:58,-9.5,-9.499986,61.22,19.04,999.43 +10-12-23 23:00:14,-9.0,-8.9999869,61.24,19.04,999.38 +10-12-23 23:00:19,-9.0,-8.9999866,61.22,19.04,999.4 +10-12-23 23:00:24,-9.0,-8.9999867,61.22,19.04,999.41 +10-12-23 23:00:40,-8.5,-8.4999857,61.31,19.03,999.38 +10-12-23 23:00:45,-8.5,-8.4999861,61.3,19.04,999.44 +10-12-23 23:00:50,-8.5,-8.4999857,61.28,19.04,999.41 +10-12-23 23:01:06,-8.0,-7.999987,61.21,19.07,999.43 +10-12-23 23:01:11,-8.0,-7.9999868,61.17,19.07,999.46 +10-12-23 23:01:16,-8.0,-7.9999865,61.21,19.07,999.38 +10-12-23 23:01:32,-7.5,-7.4999863,61.1,19.08,999.44 +10-12-23 23:01:37,-7.5,-7.4999864,61.09,19.09,999.38 +10-12-23 23:01:42,-7.5,-7.4999861,61.1,19.1,999.45 +10-12-23 23:01:58,-7.0,-6.9999873,61.07,19.1,999.4 +10-12-23 23:02:03,-7.0,-6.9999868,61.06,19.09,999.39 +10-12-23 23:02:08,-7.0,-6.9999866,61.07,19.09,999.39 +10-12-23 23:02:24,-6.5,-6.4999883,61.07,19.08,999.39 +10-12-23 23:02:30,-6.5,-6.4999882,61.11,19.1,999.4 +10-12-23 23:02:35,-6.5,-6.4999882,61.13,19.09,999.41 +10-12-23 23:02:51,-6.0,-5.9999874,61.14,19.09,999.43 +10-12-23 23:02:56,-6.0,-5.9999876,61.12,19.09,999.41 +10-12-23 23:03:01,-6.0,-5.9999873,61.1,19.08,999.31 +10-12-23 23:03:17,-5.5,-5.4999885,61.18,19.06,999.42 +10-12-23 23:03:22,-5.5,-5.4999884,61.17,19.05,999.43 +10-12-23 23:03:27,-5.5,-5.4999882,61.18,19.06,999.41 +10-12-23 23:03:43,-5.0,-4.999988,61.16,19.06,999.42 +10-12-23 23:03:48,-5.0,-4.9999878,61.15,19.06,999.44 +10-12-23 23:03:53,-5.0,-4.9999878,61.19,19.07,999.45 +10-12-23 23:04:09,-4.5,-4.499989,61.27,19.04,999.41 +10-12-23 23:04:14,-4.5,-4.4999889,61.28,19.05,999.45 +10-12-23 23:04:19,-4.5,-4.4999887,61.25,19.06,999.41 +10-12-23 23:04:35,-4.0,-3.9999885,61.22,19.05,999.45 +10-12-23 23:04:40,-4.0,-3.9999885,61.25,19.05,999.43 +10-12-23 23:04:45,-4.0,-3.9999885,61.29,19.03,999.41 +10-12-23 23:05:01,-3.5,-3.4999901,61.33,19.06,999.38 +10-12-23 23:05:06,-3.5,-3.4999899,61.27,19.07,999.4 +10-12-23 23:05:11,-3.5,-3.4999899,61.25,19.07,999.4 +10-12-23 23:05:27,-3.0,-2.9999899,61.23,19.08,999.39 +10-12-23 23:05:32,-3.0,-2.9999895,61.14,19.07,999.4 +10-12-23 23:05:37,-3.0,-2.9999896,61.2,19.07,999.49 +10-12-23 23:05:53,-2.5,-2.4999901,61.16,19.09,999.41 +10-12-23 23:05:58,-2.5,-2.4999901,61.14,19.08,999.39 +10-12-23 23:06:03,-2.5,-2.4999899,61.14,19.08,999.36 +10-12-23 23:06:19,-2.0,-1.9999907,61.19,19.06,999.42 +10-12-23 23:06:24,-2.0,-1.9999904,61.19,19.09,999.44 +10-12-23 23:06:29,-2.0,-1.9999902,61.16,19.09,999.38 +10-12-23 23:06:45,-1.5,-1.4999911,61.13,19.09,999.38 +10-12-23 23:06:50,-1.5,-1.4999914,61.14,19.09,999.41 +10-12-23 23:06:56,-1.5,-1.499991,61.12,19.1,999.46 +10-12-23 23:07:12,-1.0,-0.9999921,61.1,19.1,999.42 +10-12-23 23:07:17,-1.0,-0.9999921,61.11,19.08,999.39 +10-12-23 23:07:22,-1.0,-0.9999921,61.13,19.07,999.41 +10-12-23 23:07:38,-0.5,-0.4999912,61.16,19.06,999.36 +10-12-23 23:07:43,-0.5,-0.499991,61.21,19.07,999.41 +10-12-23 23:07:48,-0.5,-0.499991,61.17,19.07,999.43 diff --git a/advantest-R6581T-781T0050/datron-4805-XANS1/data/advantest-R6581T-781T0050---datron-4805-XANS1---TEST3.jpg b/advantest-R6581T-781T0050/datron-4805-XANS1/data/advantest-R6581T-781T0050---datron-4805-XANS1---TEST3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f19eb95dff404e9ae54a49fa57bc7062eb986a75 GIT binary patch literal 22514 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 z zq`j7Vx9nOD0U0-Q3}e#+BEpALYpw3~BE=k`4zr-f%{-$cCD=fGInK6(A!73CH@*x*J}=?33cwKDMkE+OI}Y1F zEwocY7^`=cw8jgl4kgMnEiA1qlRLZcW5R=Dbd_aj{UoT0W~;KMB%UOi!4H__$%6GD zT?aa6jp$lE1hRHypuy0YEa6agb?}tyxbLZ(mWPotUml?&AtA;m92)c@Uqf7d;-^Hn zI}vZYdI851HTd+csoS(f!VykES*zXC<<)KrDlsiJXHDayPSW?Js0pp>yh~{mv?KdB zmMNsXt*!_&l>{4!njajE0zP$D1^dnb+D1I|;o^Xk$}ec)YYV;vzX&s{a;9lFew(MU zR&?qExC1bQEV$5pEhw*esIuxiLa16|ky~O$iy0CmV`C$U6fU_aLT>Wi#2Pxg#g;ps zHimnu!vceY@yA=tx7(NUM+Fv*?U~0np>cXmN!`c)TULNK+hbRl+YvuA6JCD@KL1*v zrhK5%wlkH-Rnwwr?%IMl!Yp3pXjDdXXDNk;h_*-bK{U7;X!^%CE+pE(d$CL++ee^HD zv#SugOR2GxK&G^{|JMBZU(T!lo|pf{C)M!%((t>J`t>%3jPCnwxSiJ(Dbf7O#a~b0 zKb+tJTTF4V{P4aQWDS<{^Oos{aBBBubA8EDzv$KrQ)?_w5{niq_Insht$_ZJ`j}?p zx|?hd37)78aMi)@caG7n8up~z;+xGus1A}hUq)xcKQlHRzYB@-;n%s~)+z~Qehvi` z{PtyQqs{hNNM3iNrXp$I&g|){*wp(|O!xfmfz+Tqk!Q{#cCCAjt94(9`| zg1_v`v`9i$&ba(6J%rXEA|gl3agW#M&x3QX#swE@W34$U@#O_So+%3DR9AlfV&9ft zwUWwqJnro}fTRKQ4G197ip@&dO|+zeQERM%c`O)qZj2$5$2E%s%YP2ne#hEBNa)ni zc|n0pdzf<&w*&Xc-_~9w2p?lX0c%g+ErygDIsIQ@#Q)Cse-Z%v_gH|zRtFMEIl8mG zbh9^H=WQ6LpK)?p?3Dp-?{q(9z%i;5AcLi90aIcVX<#pu*B^tGm71rKJ zLb4|q-gX06&%dNyNDRx=5x$w%+hUir0vT`*FArrShacHIwe)gO6OoAjadJ}3Drt~D8LGP{_WLb@akZ(2?5zB>28a6kku0N- z1CiH^4-MIDt3G>tFIq?2z^5Y4zVBYdj4EJFnS}Uk^3q^#cX{0BlF^Lt=1!I)IQr-i@4ihr&V>6)=juJn)b8D&T<@Zs>u|4_$n1_elV>v0y-CW zkF)%SdSK)cOY0UYzo>oMo@BX*bk}@vi7|YjN3|qP^))A+vH@z=1AhOXO43a7)s zHMdEay%YL!_nr>9ic`nkc4fWqiJib~0iz4a(`3vNnBPREFRiSOBYx$pD@AJm8vJhL zL_u2o!IV}=SJ{W}GyUZM>oNAfh5d#W6xajhvNF5p(f4KiCf5wrlw(Yp)~KlU$SdIk zr&GKha(ys7Kj$vAqHy~}FlE^Dyv{=1mr+hQq}DFcA~9@Hhg39SeK;TeO_?F{KKnP- z$8WHmil?d}_+QWR;~3y^Wno2AX?nL6?XBW`e(J|eC9OoO@61~B^v|adP!`Ei1+}ha zUyD>9hkT{5yfjoA6Qyv3g%6g*=lL}ZK!KGWs{CzsmY#<52bH30`)-b+uhBd4t>zSx zvAC2qL36O84*1V7w`{2bJH|1t4Fwvxz&D0r7ZT-qSL6=;*T<$%pq(i-Ydxm3GTNF& zTA+-%gtMCq(FVy*gzVMZbjz#ggh%I|tYb?N)-3v{6=y*oL!HC~nr2nx+|~m}{)Tei zh9|9$PHAHzKk2q=ah0V@a&?GU{3!kfYHuQ$+qJSP1!Lg8vX5NN&?z&Q+eg!iYh$y! zO%m#N@+PRr7K>~}uwmwsGY94Zw+q1Y@xqWNk~cJ(g}0bB>$jIbkn2GhCcXa0Hazej zZ_y!#6`=pp_9w{T#|T9gb}R*9@CxYV$4l?*(MRf)PMPRX+)EXbKokq>s4Om+E82CJ z#pn;D8z7Z$^tOMyE}apg`cQ%VWfXrUg|-7==tcE6WAe*rKa2|t<=Evq+ahMRPOm7j z4?Vjg`q*UA0|(co-vReAA$ftqR)-U?OF9U#XguNDPC8%fhXTP0FhFH27YaNpsD=Wb zu%fPuHhcS*NW6dBO!>zf)g;CLEHUiDO-)FArnq2c&}p@?Ww#k>d3~w@Z31@xJx5ie z#0gmS+ak#*c*9{_c)vFZ3J?_pe@0J?>M?KNEgC6!jsMz#h}nVQp^+QMbLuK;83UU( zKNauhyzyUU|5AFfq5q-B0-$v@?oE>(ai)@+}z$nV6S{ z2MMtpw8}m${v=Q;_&rev72F3J9-jXDUXOnnIaoDhz8b_|#}0Bc2?Y)VH#U+n?S5(d z<(7g_*rBOk+WrigZlCAlD~IBc&k)wJwlo6A;||uzUADgc#|B9>NOw4v=V#QcrFyc` zW4*J8X+HzMox1vm27|G~UqHcV$-dqVd5?f!`X+LiO5uTmjt(zvwwfYJ(|S5+;J;Qe z|D2ZFl0c#gH*4&brkoqKq9y7oymGasxNxKg$qtcBUh(dRS}OfA!W%jjG`x3r?=DJ6 zU!gV?A8M;%!vh-f{69GO7GeBks<*D@c+W-|8mQ}I*ETnCVOit zy&x!k#)7**aSmaoO}SWL0YFle1~69!kRB$RYeLd9Wd!GgPOH+ix z?4+WUc)9fJLeA9`4xk#{XL+Ri?OeXWn=>lEP(h^!6kfnpdWQ{pJ6w`VwfAqVh)OTo zQxd9%S0gO@>-AOFV#7MfEd#|F8Vy!AzG8>$2uC$tP5mK3dUkU$_a0q^m)$s(I8L#EKKgNDRHZmz(||te ze-;*SH_oaUs2-uMe>Y=Z+DakJNVib(wwBSRUXD*mfH%AHy}LX`cFu&wSPVmnc;;k( zhPEVm31!`pROh|UCJ!5=Z*0=^^}h$k-y>e{BNVIGtA1$JAUa#$L^@Stq2$L*mp)1` z2XsO~Id;D)P+Gt!r|11*9DPL@>H>vw1Tv2x57ijwSRU?DLfQOeO^a4rX0P#ZMl8SN zTG=4>@w+DNhy10XeB%zV(woG5#8k_SicU%d8pmqdlblw=}QdhjEx#H`N%D z(b05p)yt}I8w1Np2i_K2+ai>-uOpELisd2NIMbxtB$5mjfc9@V^oPr{PGwxwx1?Rr zf|wkPt=YSf&MlAc5q?`oN<=Bt{Ao14kH|Xh!CBc+Eo%s;y`nU7#h5X}39&yX%p+5n z<~zI2O}DenZ(muZ7EEfJM~ISzPZP^0kqXJs>LVBu;lBn@ti&BXaVkeZ?sVy*xuslR z$V(ozP1_-MNCr|~;k zi7&5MR$X8EcxsEA#J%?I@q*N(*GX$&_m#>w26)6_$o9zlb%+VADFEW9I6{6=QWMMvwhbE+neQcfQG%xL&w zf@g0<$Yu)z%GD0QeuZgulos`)%jF3-WuyZ=TWUmK7i~KPRLmWqz&$N<3i|ORpf=B>mKa)XMV`}G)A_lS_0V3$DhYv3Scb`dd8&63%$|4EqJotRl-|oHJ4p$5$VDM zFLSqTx*l3q2py%>cm}*gCh|@rJ7VKH z<%NAq0rEz)sv4K=ltA?OlS{=GJ6qZupY_-ggi=&5UV2yztkzx zkd=ds>A2OZlu@Lrxt_5C#)4NiNtS?V=Kb1RJCUIq>5K$nwKA>Tr(0`WhK+2WeZobd z08fSmgmkF9{q6p4LYfy_8!fv4OU}ehZN%Ft8#Z>IKwzot_W5xuN#i?MdK+6;up$?} z|4vv#XvAe85q96~*L#wJTUe<5wkbCc1|N7>Dw?yVRQe4ufRZDnCcNFN-ily~2y|+} zxsHPo-=)?l8U^`3Ls+82Y7g=>g|TI3cUq{Dsa^EKR1uAXsEK5_rBMW zrfNHeY~M|)uJGbz5YQ{=NVnu-D;wM*n2Jgd=H?z~rVX${*B1!FeiB(5K=f6ZMN%_H z;gFzuQAeir@ywQ~YLNUO&K2CFC#f#Jvz{Ja#_p*Zh=ND*()2#|@j8^sWy59NP9Ray zSeA^4=vTVF6Omt`KpAhpKwSSpqxZbrhy(xab2JfaP~`AVaX<6GlWfBmk>9wbv>bVf z;6#!UFRYH+B(?pRVPCWuBNvUtE(^v_^HlahaBrmUV)Qid>mqZXwXDbkF*Vmn1liCR j``J4@BSB$VjWSZ2RGIK4!}Nmr>Yu&q|6gB&p_Bg)kv-zp literal 0 HcmV?d00001