Re: Considerations in the design of a ShortTimeFFT window?
Dietrich Brunn via SciPy-Dev <[email protected]> Mon, 04 Mar 2024 16:51:51 +0100
| Newsgroups | gmane.comp.python.scientific.devel |
|---|---|
| Message-ID | <4203513.1IzOArtZ34@rechentux> |
--===============4139670325402463384== Content-Type: multipart/signed; boundary="nextPart1804542.TLkxdtWsSY"; micalg="pgp-sha512"; protocol="application/pgp-signature" --nextPart1804542.TLkxdtWsSY Content-Type: multipart/alternative; boundary="nextPart2670133.BddDVKsqQX"; protected-headers="v1" Content-Transfer-Encoding: 7Bit From: Dietrich Brunn <[email protected]> To: [email protected] Cc: [email protected], Edward Richards <[email protected]> Date: Mon, 04 Mar 2024 16:51:42 +0100 Message-ID: <4203513.1IzOArtZ34@rechentux> MIME-Version: 1.0 This is a multi-part message in MIME format. --nextPart2670133.BddDVKsqQX Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" Hi Ned, I took the time to think about this a little bit: Unfortunately I am not aw= are of useful=20 literature for choosing STFT windows. Note that the concept of a dual windo= w for the=20 ISTFT does not seem to be widely known in the signal processing community. = The only=20 other implementation I know, which provides a dual window is LTFAT [1]=20 Designing a STFT based differentiator is a bit involving, so let's discuss = an FFT based one=20 first: The continuous-time signal representation of a sampled signal of fin= ite length can be=20 expressed by a complex-valued Fourier series E. g., for signal of duration= one, we can=20 write x(t) =3D Sum[ X[l] exp(2j=CF=80(l =CE=94 f) t ) ] with l being the summat= ion index.=20 The coefficients X[l] can be calculated with an FFT ([2] discusses this fro= m a different=20 angle). Differentiation with respect to time gives=20 d/dt x(t) =3D Sum[ X[l] 2j=CF=80(l =CE=94 f) exp(2j=CF=80(l =CE=94 f) t) = ] . Note that x(t) is assumed to be periodic. Hence a discontinuity between sta= rt and end of=20 signal produces ringing due to Gibb's phenomenon. The key insight of the ShortTimeFFT implementation is that any signal can b= e represented=20 by a series expansion of time- and frequency-shifted dual windows, i.e., x(t) =3D Sum[ S[q, p] d(t - p =CE=94t) exp(2j=CF=80(q =CE=94 f) t ) ]=20 with (p =CE=94t) representing the time shift, (q =CE=94 f) the frequency s= hift, d(t) the dual window and=20 S[p, q] the STFT coefficient (consult [3] for details). Differentiation with respect to time gives=20 d/dt x(t) =3D Sum[ S[q, p] 2j=CF=80(q =CE=94 f) d(t - p =CE=94t) exp(2j=CF= =80(q =CE=94 f) t ) ] +=20 S[q, p] exp(2j=CF=80(q =CE=94 f) t ) d/dt d(t = =2D p =CE=94t) ]=20 Note that: * The window dependent term is parameterized by the derivative of the dual= window d/dt=20 d(t - p =CE=94t). * If the signal is not periodic in each slice which is stenciled out by the= sliding window,=20 Gibb's phenomenon will strike again (this is what you probably observe in y= our=20 simulation). Hence it is a good idea to choose a dual window, like the Hann= window, which=20 suppresses discontinuities at the beginning and end of the signal slice. =20 * Not only the dual window but also its derivative needs to suppress those = discontinuities.=20 The following example shows an example of STFT based differentiation. The h= op width is=20 chosen small enough to supress Gibb's phenomenon in the dual window derivat= ive. Note =20 that Gibb's phenomenon can be observed at the beginning and the end of the= signal. import matplotlib.pyplot as plt import numpy as np from scipy.signal import ShortTimeFFT from scipy.signal import windows from scipy.fft import rfft, rfftfreq, irfft # Create periodic test signal and its derivative: n, T =3D 1000, 1/1000 # samples and sampling interval for 1 second signal t =3D np.arange(n) * T # time stamps # Create single frequency signal and derivative: f =3D rfftfreq(n, T) k_c =3D f.searchsorted(7) omega_c =3D 2*np.pi*f[k_c] X =3D np.zeros(len(f)) X[k_c] =3D n/2/omega_c x =3D irfft(X, n=3Dn) y =3D irfft(2j*np.pi*f*X, n=3Dn) # dx / dt # Two ShortTimeFFT instances are needed: kw =3D dict(hop=3D10, fs=3D1/T,fft_mode=3D'onesided', phase_shift=3DNone) SFT =3D ShortTimeFFT.from_dual(windows.hann(32, sym=3DFalse), **kw) # Differentiate dual window per FFT: diff_dual_win =3D irfft(rfft(SFT.dual_win) * 2j*np.pi*rfftfreq(SFT.m_num)) dSFT =3D ShortTimeFFT.from_dual(diff_dual_win, **kw) # Perform the filtering: S_x =3D SFT.stft(x) dS_x =3D 2j*np.pi*SFT.f[:, np.newaxis] * S_x dx =3D SFT.istft(dS_x, k1=3Dn) + dSFT.istft(S_x, k1=3Dn) # Plot windows: fg0, axx0 =3D plt.subplots(2, 1, sharex=3D'all', tight_layout=3DTrue) axx0[0].set(title=3D"Windows") axx0[1].set(title=3D"Dual Windows") axx0[0].plot(SFT.win, '.-', alpha=3D0.5, label=3D'SFT') axx0[0].plot(dSFT.win, '.-', alpha=3D0.5, label=3D'dSFT') axx0[1].plot(SFT.dual_win, '.-', alpha=3D0.5, label=3D'SFT') axx0[1].plot(dSFT.dual_win, '.-', alpha=3D0.5, label=3D'dSFT') # Plot signal: fg1, ax1 =3D plt.subplots() ax1.set(title=3Drf"STFT-based Differentiator for $f_c=3D{f[k_c]}\,$Hz Signa= l", xlabel=3D"Time $t$", ylabel=3D"Amplitude") ax1.plot(t, omega_c * x, alpha=3D0.5, label=3Dr"$x(t) \cdot 2\pi f_c$") ax1.plot(t, y, '--', alpha=3D0.5, label=3D"$y =3D dx/dt$") --nextPart2670133.BddDVKsqQX Content-Transfer-Encoding: base64 Content-Type: text/html; charset="UTF-8" PGh0bWw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRl eHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CjwvaGVhZD4KPGJvZHk+PHAgc3R5bGU9Im1hcmdpbi10 b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPkhpIE5l ZCw8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0 OjA7bWFyZ2luLXJpZ2h0OjA7Ij5JIHRvb2sgdGhlIHRpbWUgdG8gdGhpbmsgYWJvdXQgdGhpcyBh IGxpdHRsZSBiaXQ6IFVuZm9ydHVuYXRlbHkgSSBhbSBub3QgYXdhcmUgb2YgdXNlZnVsIGxpdGVy YXR1cmUgZm9yIGNob29zaW5nIFNURlQgd2luZG93cy4gTm90ZSB0aGF0IHRoZSBjb25jZXB0IG9m IGEgZHVhbCB3aW5kb3cgZm9yIHRoZSBJU1RGVCBkb2VzIG5vdCBzZWVtIHRvIGJlIHdpZGVseSBr bm93biBpbiB0aGUgc2lnbmFsIHByb2Nlc3NpbmcgY29tbXVuaXR5LiBUaGUgb25seSBvdGhlciBp bXBsZW1lbnRhdGlvbiBJIGtub3csIHdoaWNoIHByb3ZpZGVzIGEgZHVhbCB3aW5kb3cgaXMgTFRG QVQgWzFdIDwvcD4KPGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7 bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPkRlc2lnbmluZyBhIFNURlQgYmFzZWQgZGlm ZmVyZW50aWF0b3IgaXMgYSBiaXQgaW52b2x2aW5nLCBzbyBsZXQncyBkaXNjdXNzIGFuIEZGVCBi YXNlZCBvbmUgZmlyc3Q6IFRoZSBjb250aW51b3VzLXRpbWUgc2lnbmFsIHJlcHJlc2VudGF0aW9u IG9mIGEgc2FtcGxlZCBzaWduYWwgb2YgZmluaXRlIGxlbmd0aCBjYW4gYmUgZXhwcmVzc2VkIGJ5 IGEgY29tcGxleC12YWx1ZWQgRm91cmllciBzZXJpZXMmbmJzcDsgRS4gZy4sIGZvciBzaWduYWwg b2YgZHVyYXRpb24gb25lLCB3ZSBjYW4gd3JpdGU8L3A+CjxiciAvPjxwIHN0eWxlPSJtYXJnaW4t dG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij54KHQp ID0gU3VtWyZuYnNwOyBYW2xdJm5ic3A7IGV4cCgyas+AKGwgzpQgZikgdCApIF0gd2l0aCBsIGJl aW5nIHRoZSBzdW1tYXRpb24gaW5kZXguIDwvcD4KPGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6 MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPlRoZSBjb2Vm ZmljaWVudHMgWFtsXSBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoIGFuIEZGVCAoWzJdIGRpc2N1c3Nl cyB0aGlzIGZyb20gYSBkaWZmZXJlbnQgYW5nbGUpLiBEaWZmZXJlbnRpYXRpb24gd2l0aCByZXNw ZWN0IHRvIHRpbWUgZ2l2ZXMgPC9wPgo8YnIgLz48cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdp bi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+ZC9kdCB4KHQpID0gU3Vt WyZuYnNwOyBYW2xdJm5ic3A7IDJqz4AobCDOlCBmKSBleHAoMmrPgChsIM6UIGYpIHQpIF0gLjwv cD4KPGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxl ZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPk5vdGUgdGhhdCB4KHQpIGlzIGFzc3VtZWQgdG8gYmUgcGVy aW9kaWMuIEhlbmNlIGEgZGlzY29udGludWl0eSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgb2Ygc2ln bmFsIHByb2R1Y2VzIHJpbmdpbmcgZHVlIHRvIEdpYmIncyBwaGVub21lbm9uLjwvcD4KPGJyIC8+ PGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6 MDttYXJnaW4tcmlnaHQ6MDsiPlRoZSBrZXkgaW5zaWdodCBvZiB0aGUgU2hvcnRUaW1lRkZUIGlt cGxlbWVudGF0aW9uIGlzIHRoYXQgYW55IHNpZ25hbCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYSBz ZXJpZXMgZXhwYW5zaW9uIG9mIHRpbWUtIGFuZCBmcmVxdWVuY3ktc2hpZnRlZCBkdWFsIHdpbmRv d3MsIGkuZS4sPC9wPgo8YnIgLz48cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206 MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+eCh0KSA9IFN1bVsmbmJzcDsgU1txLCBw XSBkKHQgLSBwIM6UdCkgZXhwKDJqz4AocSDOlCBmKSB0ICkgXSA8L3A+CjxiciAvPjxwIHN0eWxl PSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0 OjA7Ij53aXRoIChwIM6UdCkgcmVwcmVzZW50aW5nIHRoZSB0aW1lIHNoaWZ0LCZuYnNwOyAocSDO lCBmKSB0aGUgZnJlcXVlbmN5IHNoaWZ0LCBkKHQpIHRoZSBkdWFsIHdpbmRvdyBhbmQgU1twLCBx XSB0aGUgU1RGVCBjb2VmZmljaWVudCAoY29uc3VsdCBbM10gZm9yIGRldGFpbHMpLjwvcD4KPHAg c3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4t cmlnaHQ6MDsiPkRpZmZlcmVudGlhdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGltZSBnaXZlcyA8L3A+ CjxiciAvPjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0 OjA7bWFyZ2luLXJpZ2h0OjA7Ij5kL2R0IHgodCkgPSBTdW1bIFNbcSwgcF0gMmrPgChxIM6UIGYp Jm5ic3A7IGQodCAtIHAgzpR0KSBleHAoMmrPgChxIM6UIGYpIHQgKSBdJm5ic3A7ICsgPC9wPgo8 cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdp bi1yaWdodDowOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7IFNbcSwgcF0gZXhwKDJqz4AocSDOlCBmKSB0ICkmbmJzcDsgZC9kdCBkKHQgLSBwIM6UdCkg XSA8L3A+CjxiciAvPjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdp bi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij5Ob3RlIHRoYXQ6PC9wPgo8YnIgLz48cCBzdHlsZT0i bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDow OyI+KiBUaGUgd2luZG93IGRlcGVuZGVudCB0ZXJtIGlzIHBhcmFtZXRlcml6ZWQgYnkgdGhlIGRl cml2YXRpdmUgb2YgdGhlJm5ic3A7IGR1YWwgd2luZG93IGQvZHQgZCh0IC0gcCDOlHQpLjwvcD4K PGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6 MDttYXJnaW4tcmlnaHQ6MDsiPiogSWYgdGhlIHNpZ25hbCBpcyBub3QgcGVyaW9kaWMgaW4gZWFj aCBzbGljZSB3aGljaCBpcyBzdGVuY2lsZWQgb3V0IGJ5IHRoZSBzbGlkaW5nIHdpbmRvdywgR2li YidzIHBoZW5vbWVub24gd2lsbCBzdHJpa2UgYWdhaW4gKHRoaXMgaXMgd2hhdCB5b3UgcHJvYmFi bHkgb2JzZXJ2ZSBpbiB5b3VyIHNpbXVsYXRpb24pLiBIZW5jZSBpdCBpcyBhIGdvb2QgaWRlYSB0 byBjaG9vc2UgYSBkdWFsIHdpbmRvdywgbGlrZSB0aGUgSGFubiB3aW5kb3csIHdoaWNoIHN1cHBy ZXNzZXMgZGlzY29udGludWl0aWVzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgc2ln bmFsIHNsaWNlLiZuYnNwOyA8L3A+CjxiciAvPjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2lu LWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4qIE5vdCBvbmx5IHRoZSBk dWFsIHdpbmRvdyBidXQgYWxzbyBpdHMgZGVyaXZhdGl2ZSBuZWVkcyB0byBzdXBwcmVzcyB0aG9z ZSBkaXNjb250aW51aXRpZXMuIDwvcD4KPGJyIC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJn aW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPlRoZSBmb2xsb3dpbmcg ZXhhbXBsZSBzaG93cyBhbiBleGFtcGxlIG9mIFNURlQgYmFzZWQgZGlmZmVyZW50aWF0aW9uLiBU aGUgaG9wIHdpZHRoIGlzIGNob3NlbiBzbWFsbCBlbm91Z2ggdG8gc3VwcmVzcyBHaWJiJ3MgcGhl bm9tZW5vbiBpbiB0aGUgZHVhbCB3aW5kb3cgZGVyaXZhdGl2ZS4gTm90ZSZuYnNwOyB0aGF0IEdp YmIncyBwaGVub21lbm9uJm5ic3A7IGNhbiBiZSBvYnNlcnZlZCBhdCB0aGUgYmVnaW5uaW5nIGFu ZCB0aGUgZW5kIG9mIHRoZSBzaWduYWwuPC9wPgo8YnIgLz48cCBzdHlsZT0ibWFyZ2luLXRvcDow O21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OkpldEJyYWlucyBNb25vOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhl NmQ7Ij5pbXBvcnQgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+bWF0cGxvdGxp Yi5weXBsb3QgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojY2Y4ZTZkOyI+YXMgPC9zcGFuPjxz cGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+cGx0PC9wPgo8cD4mbmJzcDs8L3NwYW4+PHNwYW4g c3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij5pbXBvcnQgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjoj YmNiZWM0OyI+bnVtcHkgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojY2Y4ZTZkOyI+YXMgPC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+bnA8L3A+CjxwPiZuYnNwOzwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2ZDsiPmZyb20gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjojYmNiZWM0OyI+c2NpcHkuc2lnbmFsIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2 ZDsiPmltcG9ydCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5TaG9ydFRpbWVG RlQ8L3A+CjxwPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2ZDsiPmZyb20g PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+c2NpcHkuc2lnbmFsIDwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2ZDsiPmltcG9ydCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiNiY2JlYzQ7Ij53aW5kb3dzPC9wPgo8cD4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiNjZjhlNmQ7Ij5mcm9tIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPnNj aXB5LmZmdCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij5pbXBvcnQgPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+cmZmdCwgcmZmdGZyZXEsIGlyZmZ0PC9wPgo8 cD4mbmJzcDs8cD4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM3YTdlODU7Ij4jIENy ZWF0ZSBwZXJpb2RpYyB0ZXN0IHNpZ25hbCBhbmQgaXRzIGRlcml2YXRpdmU6PC9wPgo8cD4mbmJz cDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5uLCBUID0gPC9zcGFuPjxzcGFu IHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+MTAwMDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2Jj YmVjNDsiPiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+MTwvc3Bhbj48c3Bh biBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPi88L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFj Yjg7Ij4xMDAwJm5ic3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzdhN2U4NTsiPiMgc2Ft cGxlcyBhbmQgc2FtcGxpbmcgaW50ZXJ2YWwgZm9yIDEgc2Vjb25kIHNpZ25hbDwvcD4KPHA+Jm5i c3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+dCA9IG5wLmFyYW5nZShuKSAq IFQmbmJzcDsgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojN2E3ZTg1OyI+IyB0aW1lIHN0YW1w czxiciAvPiMgQ3JlYXRlIHNpbmdsZSBmcmVxdWVuY3kgc2lnbmFsIGFuZCBkZXJpdmF0aXZlOjwv cD4KPHA+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+ZiA9IHJmZnRm cmVxKG4sIFQpPGJyIC8+a19jID0gZi5zZWFyY2hzb3J0ZWQoPC9zcGFuPjxzcGFuIHN0eWxlPSJj b2xvcjojMmFhY2I4OyI+Nzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8YnIg Lz5vbWVnYV9jID0gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+Mjwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPipucC5waSpmW2tfY108YnIgLz5YID0gbnAuemVy b3MoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojODg4OGM2OyI+bGVuPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjojYmNiZWM0OyI+KGYpKTxiciAvPlhba19jXSA9IG4vPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjojMmFhY2I4OyI+Mjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsi Pi9vbWVnYV9jPGJyIC8+eCA9IGlyZmZ0KFgsIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2Fh NDkyNjsiPm48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49bik8YnIgLz55ID0g aXJmZnQoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+Mmo8L3NwYW4+PHNwYW4g c3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4qbnAucGkqZipYLCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiNhYTQ5MjY7Ij5uPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PW4pJm5i c3A7IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzdhN2U4NTsiPiMgZHggLyBkdDwvcD4KPHA+ Jm5ic3A7PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6 MDttYXJnaW4tcmlnaHQ6MDsiPiMgVHdvIFNob3J0VGltZUZGVCBpbnN0YW5jZXMgYXJlIG5lZWRl ZDo8L3A+CjxwPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPmt3ID0g PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojODg4OGM2OyI+ZGljdDwvc3Bhbj48c3BhbiBzdHls ZT0iY29sb3I6I2JjYmVjNDsiPig8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNhYTQ5MjY7Ij5o b3A8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjojMmFhY2I4OyI+MTA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4s IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPmZzPC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzJhYWNiODsiPjE8 L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4vVCw8L3NwYW4+PHNwYW4gc3R5bGU9 ImNvbG9yOiNhYTQ5MjY7Ij5mZnRfbW9kZTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj NDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4nb25lc2lkZWQnPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y OiNhYTQ5MjY7Ij5waGFzZV9zaGlmdDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsi Pj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij5Ob25lPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjojYmNiZWM0OyI+KTxiciAvPlNGVCA9IFNob3J0VGltZUZGVC5mcm9tX2R1YWwo d2luZG93cy5oYW5uKDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzJhYWNiODsiPjMyPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y OiNhYTQ5MjY7Ij5zeW08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjojY2Y4ZTZkOyI+RmFsc2U8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiNiY2JlYzQ7Ij4pLCAqKmt3KTwvcD4KPHA+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxlPSJj b2xvcjojN2E3ZTg1OyI+IyBEaWZmZXJlbnRpYXRlIGR1YWwgd2luZG93IHBlciBGRlQ6PC9wPgo8 cD4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5kaWZmX2R1YWxfd2lu ID0gaXJmZnQocmZmdChTRlQuZHVhbF93aW4pICogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjoj MmFhY2I4OyI+Mmo8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4qbnAucGkqcmZm dGZyZXEoU0ZULm1fbnVtKSk8YnIgLz5kU0ZUID0gU2hvcnRUaW1lRkZULmZyb21fZHVhbChkaWZm X2R1YWxfd2luLCAqKmt3KTwvcD4KPHA+Jm5ic3A7PHA+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjojN2E3ZTg1OyI+IyBQZXJmb3JtIHRoZSBmaWx0ZXJpbmc6PC9wPgo8cD4mbmJzcDs8 L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5TX3ggPSBTRlQuc3RmdCh4KTxiciAv PmRTX3ggPSA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4yajwvc3Bhbj48c3Bh biBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPipucC5waSpTRlQuZls6LCBucC5uZXdheGlzXSAqIFNf eDxiciAvPmR4ID0gU0ZULmlzdGZ0KGRTX3gsIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2Fh NDkyNjsiPmsxPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PW4pICsgZFNGVC5p c3RmdChTX3gsIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPmsxPC9zcGFuPjxz cGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PW4pPC9wPgo8cD4mbmJzcDs8cD4mbmJzcDs8L3Nw YW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM3YTdlODU7Ij4jIFBsb3Qgd2luZG93czo8L3A+CjxwPiZu YnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPmZnMCwgYXh4MCA9IHBsdC5z dWJwbG90cyg8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4yPC9zcGFuPjxzcGFu IHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFj Yjg7Ij4xPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4g c3R5bGU9ImNvbG9yOiNhYTQ5MjY7Ij5zaGFyZXg8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNi Y2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+J2FsbCc8L3NwYW4+ PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6 I2FhNDkyNjsiPnRpZ2h0X2xheW91dDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsi Pj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij5UcnVlPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjojYmNiZWM0OyI+KTxiciAvPmF4eDBbPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjojMmFhY2I4OyI+MDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPl0uc2V0KDwv c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPnRpdGxlPC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzZhYWI3MzsiPiZx dW90O1dpbmRvd3MmcXVvdDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4pPGJy IC8+YXh4MFs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4xPC9zcGFuPjxzcGFu IHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+XS5zZXQoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjoj YWE0OTI2OyI+dGl0bGU8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+JnF1b3Q7RHVhbCBXaW5kb3dzJnF1b3Q7PC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+KTxiciAvPmF4eDBbPC9zcGFuPjxzcGFu IHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+MDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj NDsiPl0ucGxvdChTRlQud2luLCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4n Li0nPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOiNhYTQ5MjY7Ij5hbHBoYTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj NDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4wLjU8L3NwYW4+PHNwYW4g c3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDky NjsiPmxhYmVsPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3Bh biBzdHlsZT0iY29sb3I6IzZhYWI3MzsiPidTRlQnPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjoj YmNiZWM0OyI+KTxiciAvPmF4eDBbPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+ MDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPl0ucGxvdChkU0ZULndpbiwgPC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+Jy4tJzwvc3Bhbj48c3BhbiBzdHlsZT0i Y29sb3I6I2JjYmVjNDsiPiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYWE0OTI2OyI+YWxw aGE8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjojMmFhY2I4OyI+MC41PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+ LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNhYTQ5MjY7Ij5sYWJlbDwvc3Bhbj48c3BhbiBz dHlsZT0iY29sb3I6I2JjYmVjNDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7 Ij4nZFNGVCc8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4pPGJyIC8+YXh4MFs8 L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4xPC9zcGFuPjxzcGFuIHN0eWxlPSJj b2xvcjojYmNiZWM0OyI+XS5wbG90KFNGVC5kdWFsX3dpbiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJj b2xvcjojNmFhYjczOyI+Jy4tJzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPiwg PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYWE0OTI2OyI+YWxwaGE8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+ MC41PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOiNhYTQ5MjY7Ij5sYWJlbDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj NDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4nU0ZUJzwvc3Bhbj48c3Bh biBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8YnIgLz5heHgwWzwvc3Bhbj48c3BhbiBzdHlsZT0i Y29sb3I6IzJhYWNiODsiPjE8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5dLnBs b3QoZFNGVC5kdWFsX3dpbiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+Jy4t Jzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPiwgPC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjojYWE0OTI2OyI+YWxwaGE8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7 Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojMmFhY2I4OyI+MC41PC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNhYTQ5MjY7 Ij5sYWJlbDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPj08L3NwYW4+PHNwYW4g c3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4nZFNGVCc8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNi Y2JlYzQ7Ij4pPC9wPgo8cD4mbmJzcDs8cD4mbmJzcDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y OiM3YTdlODU7Ij4jIFBsb3Qgc2lnbmFsOjwvcD4KPHA+Jm5ic3A7PC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjojYmNiZWM0OyI+ZmcxLCBheDEgPSBwbHQuc3VicGxvdHMoKTxiciAvPmF4MS5zZXQo PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYWE0OTI2OyI+dGl0bGU8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+ cmYmcXVvdDtTVEZULWJhc2VkIERpZmZlcmVudGlhdG9yIGZvciAkZl9jPTwvc3Bhbj48c3BhbiBz dHlsZT0iY29sb3I6I2NmOGU2ZDsiPns8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7 Ij5mW2tfY108L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNjZjhlNmQ7Ij59PC9zcGFuPjxzcGFu IHN0eWxlPSJjb2xvcjojNmFhYjczOyI+XCwkSHogU2lnbmFsJnF1b3Q7PC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjojYmNiZWM0OyI+LDxiciAvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNhYTQ5MjY7Ij54bGFiZWw8 L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9zcGFuPjxzcGFuIHN0eWxlPSJj b2xvcjojNmFhYjczOyI+JnF1b3Q7VGltZSAkdCQmcXVvdDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPnlsYWJl bDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9 ImNvbG9yOiM2YWFiNzM7Ij4mcXVvdDtBbXBsaXR1ZGUmcXVvdDs8L3NwYW4+PHNwYW4gc3R5bGU9 ImNvbG9yOiNiY2JlYzQ7Ij4pPGJyIC8+YXgxLnBsb3QodCwgb21lZ2FfYyAqIHgsIDwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPmFscGhhPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjojYmNiZWM0OyI+PTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzJhYWNiODsiPjAuNTwvc3Bh bj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPiwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjojYWE0OTI2OyI+bGFiZWw8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij49PC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojNmFhYjczOyI+ciZxdW90OyR4KHQpIFxjZG90IDJccGkg Zl9jJCZxdW90Ozwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8YnIgLz5heDEu cGxvdCh0LCB5LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiM2YWFiNzM7Ij4nLS0nPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+LCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y OiNhYTQ5MjY7Ij5hbHBoYTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPj08L3Nw YW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4wLjU8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDkyNjsiPmxhYmVs PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3BhbiBzdHlsZT0i Y29sb3I6IzZhYWI3MzsiPiZxdW90OyR5ID0gZHgvZHQkJnF1b3Q7PC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjojYmNiZWM0OyI+KTxiciAvPmF4MS5wbG90KHQsIGR4LCA8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOiNhYTQ5MjY7Ij5hbHBoYTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVj NDsiPj08L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiMyYWFjYjg7Ij4wLjU8L3NwYW4+PHNwYW4g c3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij4sIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2FhNDky NjsiPmxhYmVsPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+PTwvc3Bhbj48c3Bh biBzdHlsZT0iY29sb3I6IzZhYWI3MzsiPiZxdW90O1NURlQtYmFzZWQgJGR4L2R0JCZxdW90Ozwv c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8L3A+CjxwPiZuYnNwOzxwPiZuYnNw OzxwPiZuYnNwOzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2NmOGU2ZDsiPmZvciA8L3NwYW4+ PHNwYW4gc3R5bGU9ImNvbG9yOiNiY2JlYzQ7Ij5heF8gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjojY2Y4ZTZkOyI+aW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojYmNiZWM0OyI+KCpheHgw LCBheDEpOjxiciAvPiZuYnNwOyZuYnNwOyZuYnNwOyBheF8ubGVnZW5kKCk8YnIgLz4mbmJzcDsm bmJzcDsmbmJzcDsgYXhfLmdyaWQoPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjojY2Y4ZTZkOyI+ VHJ1ZTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6I2JjYmVjNDsiPik8L3A+CjxwPiZuYnNwOzxw IHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2lu LXJpZ2h0OjA7Ij5wbHQuc2hvdygpPC9wPgo8cD4mbmJzcDs8L3NwYW4+PC9zcGFuPjwvcD4KPGJy IC8+PHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDtt YXJnaW4tcmlnaHQ6MDsiPkNoZWVycywgZGlldHJpY2g8L3A+CjxiciAvPjxiciAvPjxiciAvPjxw IHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2lu LXJpZ2h0OjA7Ij5bMV0gPGEgaHJlZj0iaHR0cHM6Ly9sdGZhdC5vcmcvZG9jL2dhYm9yLyI+aHR0 cHM6Ly9sdGZhdC5vcmcvZG9jL2dhYm9yLzwvYT48L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7 bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij5bMl0gPGEgaHJl Zj0iaHR0cHM6Ly9zY2lweS5naXRodWIuaW8vZGV2ZG9jcy90dXRvcmlhbC9zaWduYWwuaHRtbCNz cGVjdHJhbC1hbmFseXNpcyI+aHR0cHM6Ly9zY2lweS5naXRodWIuaW8vZGV2ZG9jcy90dXRvcmlh bC9zaWduYWwuaHRtbCNzcGVjdHJhbC1hbmFseXNpczwvYT48L3A+CjxwIHN0eWxlPSJtYXJnaW4t dG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij5bM10g PGEgaHJlZj0iaHR0cHM6Ly9zY2lweS5naXRodWIuaW8vZGV2ZG9jcy90dXRvcmlhbC9zaWduYWwu aHRtbCNzaG9ydC10aW1lLWZvdXJpZXItdHJhbnNmb3JtIj5odHRwczovL3NjaXB5LmdpdGh1Yi5p by9kZXZkb2NzL3R1dG9yaWFsL3NpZ25hbC5odG1sI3Nob3J0LXRpbWUtZm91cmllci10cmFuc2Zv cm08L2E+PC9wPgo8YnIgLz48cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDtt YXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+T24gU2F0dXJkYXksIDIgTWFyY2ggMjAyNCAy MjoxMDo0NSBDRVQgRWR3YXJkIFJpY2hhcmRzIHdyb3RlOjwvcD4KPHAgc3R5bGU9Im1hcmdpbi10 b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsg VGhhbmsgeW91IGZvciB5b3VyIHJlc3BvbnNlLCBEaWV0cmljaC48L3A+CjxwIHN0eWxlPSJtYXJn aW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4m Z3Q7IDwvcD4KPHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxl ZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsgV2UgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRpbmcg dGhlIGRpZmZlcmVudGlhdGlvbiBhcyB5b3Ugc3VnZ2VzdGVkOiAoMSk8L3A+CjxwIHN0eWxlPSJt YXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7 Ij4mZ3Q7IFNURlQgdGhlIHNpZ25hbCwgKDIpIG11bHRpcGx5IGVhY2ggc2xpY2UgYnkgajLPgGYs ICgzKSBJU1RGVC4gV2UgYXJlIG5vdDwvcD4KPHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4t Ym90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsgdXNpbmcgYSByZWN0 YW5ndWxhciB3aW5kb3csIHRob3VnaCBJIGNhbiBzZWUgaG93IGl0IHBlcmZvcm1zLiBJIGRlZmF1 bHQgdG88L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1s ZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7IGEgbnV0dGFsbCBmb3IgRFNQLCBhbmQgaXRzIHJl bGF0aXZlbHkgcG9vciBwZXJmb3JtYW5jZSBsZWFkIHRvIG15IHF1ZXN0aW9uLjwvcD4KPHAgc3R5 bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmln aHQ6MDsiPiZndDsgSXMgdGhlcmUgYSB3YXkgb2YgcHJlZGljdGluZyBpZiBhbiBvcGVyYXRpb24g ZG9lcyBkZXBlbmQgb24gdGhlIHdpbmRvdz8gSWY8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7 bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7IHNvLCBp cyB0aGVyZSBhIHN0YW5kYXJkIHByYWN0aWNlIGZvciBzZWxlY3Rpb24/PC9wPgo8cCBzdHlsZT0i bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDow OyI+Jmd0OyA8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdp bi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7IFRoaXMgcHJvY2VkdXJlIGRvZXMgc2hvdyBw cm9taXNlLiBUaGUgaW50ZWdyYXRpb24gc3RlcCBpcyBtdWNoIHNpbXBsZXIgd2l0aDwvcD4KPHAg c3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4t cmlnaHQ6MDsiPiZndDsgdGhlIFNURlQgdGhhbiBhIHNpbXBsZSBGRlQvSUZGVC48L3A+CjxwIHN0 eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJp Z2h0OjA7Ij4mZ3Q7IDwvcD4KPHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7 bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsgT24gU2F0LCBNYXIgMiwgMjAyNCBh dCAxOjQ54oCvQU0gRGlldHJpY2ggQnJ1bm4gJmx0O0RpZXRyaWNoLkJydW5uQHdlYi5kZSZndDsg d3JvdGU6PC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4t bGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7IEhpIE5lZCw8L3A+CjxwIHN0eWxlPSJt YXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7 Ij4mZ3Q7ICZndDsgPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDtt YXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7IGl0IGlzIG5pY2UgdG8gc2Vl IHRoYXQgdGhlIG5ldyBTVEZUIGZ1bmN0aW9uYWxpdHkgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZC48 L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1sZWZ0OjA7 bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7ICZndDsgPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21h cmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7ICZn dDsgT3VyIGZpcnN0IHVzZSBjYXNlIGlzIGFuIGludGVncmF0b3IgYW5kIGRpZmZlcmVudGlhdG9y LiBXZSBpbXBsZW1lbnQ8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTow O21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7ICZndDsgJmd0OyB0aGlzPC9wPgo8 cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdp bi1yaWdodDowOyI+Jmd0OyAmZ3Q7ICZndDsgPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21h cmdpbi1ib3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7ICZn dDsgd2l0aCBhIGZvcndhcmQvaW52ZXJzZSBzdGZ0IHBhaXIsIGFuZCB0aGUgZnJlcXVlbmN5IGRv bWFpbiBjYWxjdWx1czwvcD4KPHAgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7 bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsgJmd0OyAmZ3Q7IDwvcD4KPHAgc3R5 bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmln aHQ6MDsiPiZndDsgJmd0OyAmZ3Q7IGRlZmluaXRpb25zLjwvcD4KPHAgc3R5bGU9Im1hcmdpbi10 b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsg Jmd0OyA8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21hcmdpbi1s ZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7ICZndDsgTWF5IEkgYXNrIGhvdyB5b3UgaW1wbGVt ZW50ZWQgdGhlIGRpZmZlcmVudGlhdGlvbiBpbiB0aGUgU1RGVCBzcGFjZT8gTm90ZTwvcD4KPHAg c3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4t cmlnaHQ6MDsiPiZndDsgJmd0OyB0aGF0IGRpZmZlcmVudGlhdGlvbiAqaXMqIHdpbmRvdyBkZXBl bmRlbnQuIEFuIGFkLWhvYyBhcHByb2FjaCB3b3VsZCBiZTwvcD4KPHAgc3R5bGU9Im1hcmdpbi10 b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDsiPiZndDsg Jmd0OyB1c2luZyBhIHJlY3Rhbmd1bGFyIGR1YWwgd2luZG93ICh1dGlsaXppbmcgYFNob3J0VGlt ZUZGVC5mcm9tX2R1YWxgKSBhbmQ8L3A+CjxwIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJv dHRvbTowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ij4mZ3Q7ICZndDsgbXVsdGlwbHlp bmcgdGhlIFNURlQgYnkgajLPgGYuPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDowO21hcmdpbi1i b3R0b206MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowOyI+Jmd0OyAmZ3Q7IDwvcD4KPHAg c3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4t cmlnaHQ6MDsiPiZndDsgJmd0OyBDaGVlcnMsIGRpZXRyaWNoPC9wPgo8YnIgLz48YnIgLz48L2Jv ZHk+CjwvaHRtbD4= --nextPart2670133.BddDVKsqQX-- --nextPart1804542.TLkxdtWsSY Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part. Content-Transfer-Encoding: 7Bit -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEE2SZhCS7+RzbiScjDpKQpg4NlCTYFAmXl7g8ACgkQpKQpg4Nl CTZuLAgAgdiIjbVqas2HOBU3l0cCfX1WkHK5ssDGCroOAhNx8xqdhdD9hVhnuX1A WLXe+G3mRvFLoRb7pxsWCvsO0T22F9owvsb394sC86823isC94GOWcVIqQAb1FjH uzWwUw/uVvazjD6SUs8gJfHEUfM8Dr3dDw1hG9qr2/ULD5EosPydsWemwexsiGoA DdgwKeODz6IMhHmI0MqQ5BSzQMnv0gN2iTySKCpcoxLU3UQ9XAOiH7g+g2JMAtSG dsC26wY1sigDqrdRzgOQyaBF14A7PqM9+zvhJT7NQ7Qt4MEW2tU0oq1ft8ZTM6os dQbw7qTfYkzxMtMrLh41arnfWK6m+g== =aRFH -----END PGP SIGNATURE----- --nextPart1804542.TLkxdtWsSY-- --===============4139670325402463384== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ SciPy-Dev mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3/lists/scipy-dev.python.org/ Member address: [email protected] --===============4139670325402463384==--