Skip to content

Commit 7b42a5f

Browse files
committedJun 8, 2023
Tom's June 8 afternoon edits of two Cagan lectures plus the table of contents file
1 parent 16ebec2 commit 7b42a5f

File tree

3 files changed

+504
-3
lines changed

3 files changed

+504
-3
lines changed
 

‎lectures/_toc.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ parts:
2424
- file: cons_smooth
2525
- file: equalizing_difference
2626
- file: cagan_ree
27+
- file: cagan_adaptive
2728
- file: geom_series
2829
- caption: Probability and Distributions
2930
numbered: true

‎lectures/cagan_adaptive.md

Lines changed: 501 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,501 @@
1+
---
2+
jupytext:
3+
text_representation:
4+
extension: .md
5+
format_name: myst
6+
format_version: 0.13
7+
jupytext_version: 1.14.5
8+
kernelspec:
9+
display_name: Python 3 (ipykernel)
10+
language: python
11+
name: python3
12+
---
13+
14+
+++ {"user_expressions": []}
15+
16+
17+
18+
# A Fiscal Theory of Price Level with Adaptive Expectations
19+
20+
## Introduction
21+
22+
As usual, we'll start by importing some Python modules.
23+
24+
```{code-cell} ipython3
25+
import numpy as np
26+
from collections import namedtuple
27+
import matplotlib.pyplot as plt
28+
```
29+
30+
+++ {"user_expressions": []}
31+
32+
<!-- #region -->
33+
34+
This lecture is a sequel or prequel to this lecture {doc}`fiscal theory of the price level <cagan_ree>`.
35+
36+
We'll use linear algebra to do some experiments with an alternative "fiscal theory of the price level".
37+
38+
Like the model in this lecture {doc}`fiscal theory of the price level <cagan_ree>`, the model asserts that when a government persistently spends more than it collects in taxes and prints money to finance the shortfall, it puts upward pressure on the price level and generates persistent inflation.
39+
40+
41+
42+
Instead of the "perfect foresight" or "rational expectations" version of the model in this lecture {doc}`fiscal theory of the price level <cagan_ree>`, our model in the present lecture is an "adaptive expectations" version of a model that Philip Cagan {cite}`Cagan` used to study the monetary dynamics of hyperinflations.
43+
44+
It combines these components:
45+
46+
* a demand function for real money balances that says asserts that the logarithm of the quantity of real balances demanded depends inversely on the public's expected rate of inflation
47+
48+
* an **adaptive expectations** model that describes how the public's anticipated rate of inflation responds to past values of actual inflation
49+
50+
* an equilibrium condition that equates the demand for money to the supply
51+
52+
* an exogenous sequence of rates of growth of the money supply
53+
54+
Our model stays quite close to Cagan's original specification.
55+
56+
As in the {doc}`present values <pv>` and {doc}`consumption smoothing<cons_smooth>` lectures, the only linear algebra operations that we'll be using are matrix multplication and matrix inversion.
57+
58+
To facilitate using linear matrix algebra as our principal mathematical tool, we'll use a finite horizon version of
59+
the model.
60+
61+
## Structure of the Model
62+
63+
Let
64+
65+
* $ m_t $ be the log of the supply of nominal money balances;
66+
* $\mu_t = m_{t+1} - m_t $ be the net rate of growth of nominal balances;
67+
* $p_t $ be the log of the price level;
68+
* $\pi_t = p_{t+1} - p_t $ be the net rate of inflation between $t$ and $ t+1$;
69+
* $\pi_t^*$ be the public's expected rate of inflation between $t$ and $t+1$;
70+
* $T$ the horizon -- i.e., the last period for which the model will determine $p_t$
71+
* $\pi_0^*$ public's initial expected rate of inflation between time $0$ and time $1$.
72+
73+
74+
The demand for real balances $\exp\left(\frac{m_t^d}{p_t}\right)$ is governed by the following version of the Cagan demand function
75+
76+
$$
77+
m_t^d - p_t = -\alpha \pi_t^* \: , \: \alpha > 0 ; \quad t = 0, 1, \ldots, T .
78+
$$ (eq:caganmd)
79+
80+
81+
This equation asserts that the demand for real balances
82+
is inversely related to the public's expected rate of inflation.
83+
84+
Equating the logarithm $m_t^d$ of the demand for money to the logarithm $m_t$ of the supply of money in equation {eq}`eq:caganmd` and solving for the logarithm $p_t$
85+
of the price level gives
86+
87+
$$
88+
p_t = m_t + \alpha \pi_t^*
89+
$$ (eq:eqfiscth1)
90+
91+
Taking the difference between equation {eq}`eq:eqfiscth1` at time $t+1$ and at time
92+
$t$ gives
93+
94+
95+
96+
$$
97+
\pi_t = \mu_t + \alpha \pi_{t+1}^* - \alpha \pi_t^*
98+
$$ (eq:eqpipi)
99+
100+
We assume that the expected rate of inflation $\pi_t^*$ is governed
101+
by the Friedman-Cagan adaptive expectations scheme
102+
103+
$$
104+
\pi_{t+1}^* = \lambda \pi_t^* + (1 -\lambda) \pi_t
105+
$$ (eq:adaptexpn)
106+
107+
As exogenous inputs into the model, we take initial conditions $m_0, \pi_0^*$
108+
and a money growth sequence $\vec \mu = \{\mu_t\}_{t=0}^T$.
109+
110+
As endogenous outputs of our model we want to find sequences $\vec \pi = \{\pi_t\}_{t=0}^T, \vec p = \{p_t\}_{t=0}^T$ as functions of the endogenous inputs.
111+
112+
We'll do some mental experiments by studying how the model outputs vary as we vary
113+
the model inputs.
114+
115+
<!-- #endregion -->
116+
117+
<!-- #region -->
118+
## Representing key equations with linear algebra
119+
120+
We begin by writing the equation {eq}`eq:adaptexpn` adaptive expectations model for $\pi_t^*$ for $t=0, \ldots, T$ as
121+
122+
123+
124+
$$
125+
\begin{bmatrix} 1 & 0 & 0 & \cdots & 0 & 0 \cr
126+
-\lambda & 1 & 0 & \cdots & 0 & 0 \cr
127+
0 & - \lambda & 1 & \cdots & 0 & 0 \cr
128+
\vdots & \vdots & \vdots & \cdots & \vdots & \vdots \cr
129+
0 & 0 & 0 & \cdots & -\lambda & 1
130+
\end{bmatrix}
131+
\begin{bmatrix} \pi_0^* \cr
132+
\pi_1^* \cr
133+
\pi_2^* \cr
134+
\vdots \cr
135+
\pi_{T+1}^*
136+
\end{bmatrix} =
137+
(1-\lambda) \begin{bmatrix}
138+
0 & 0 & 0 & \cdots & 0 \cr
139+
1 & 0 & 0 & \cdots & 0 \cr
140+
0 & 1 & 0 & \cdots & 0 \cr
141+
\vdots &\vdots & \vdots & \cdots & \vdots \cr
142+
0 & 0 & 0 & \cdots & 1 \end{bmatrix}
143+
\begin{bmatrix}\pi_0 \cr \pi_1 \cr \pi_2 \cr \vdots \cr \pi_T
144+
\end{bmatrix} +
145+
\begin{bmatrix} \pi_0^* \cr 0 \cr 0 \cr \vdots \cr 0 \end{bmatrix}
146+
$$
147+
148+
Write this equation as
149+
150+
$$
151+
A \vec \pi^* = (1-\lambda) B \vec \pi + \vec \pi_0^*
152+
$$ (eq:eq1)
153+
154+
where the $(T+2) \times (T+2) $matrix $A$, the $(T+2)\times (T+1)$ matrix $B$, and the vectors $\vec \pi^* , \vec \pi_0, \pi_0^*$
155+
are defined implicitly by aligning these two equations.
156+
<!-- #endregion -->
157+
158+
<!-- #region -->
159+
Next we write the key equation {eq}`eq:eqpipi` in matrix notation as
160+
161+
$$ \begin{bmatrix}
162+
\pi_0 \cr \pi_1 \cr \pi_1 \cr \vdots \cr \pi_T \end{bmatrix}
163+
= \begin{bmatrix}
164+
\mu_0 \cr \mu_1 \cr \mu_2 \cr \vdots \cr \mu_T \end{bmatrix}
165+
+ \begin{bmatrix} - \alpha & \alpha & 0 & \cdots & 0 & 0 \cr
166+
0 & -\alpha & \alpha & \cdots & 0 & 0 \cr
167+
0 & 0 & -\alpha & \cdots & 0 & 0 \cr
168+
\vdots & \vdots & \vdots & \cdots & \alpha & 0 \cr
169+
0 & 0 & 0 & \cdots & -\alpha & \alpha
170+
\end{bmatrix}
171+
\begin{bmatrix} \pi_0^* \cr
172+
\pi_1^* \cr
173+
\pi_2^* \cr
174+
\vdots \cr
175+
\pi_{T+1}^*
176+
\end{bmatrix}
177+
$$
178+
179+
Represent the previous equation system in terms of vectors and matrices as
180+
181+
$$
182+
\vec \pi = \vec \mu + C \vec \pi^*
183+
$$ (eq:eq2)
184+
185+
where the $(T+1) \times (T+2)$ matrix $C$ is defined implicitly to align this equation with the preceding
186+
equation system.
187+
188+
189+
190+
## Harvesting Returns from our Matrix Formulation
191+
192+
193+
We now have all of the ingredients we need to solve for $\vec \pi$ as
194+
a function of $\vec \mu, \pi_0, \pi_0^*$.
195+
196+
Combine equations {eq}`eq:eq1`and {eq}`eq:eq2` to get
197+
198+
$$
199+
\begin{align*}
200+
A \vec \pi^* & = (1-\lambda) B \vec \pi + \vec \pi_0^* \cr
201+
& = (1-\lambda) B \left[ \vec \mu + C \vec \pi^* \right] + \vec \pi_0^*
202+
\end{align*}
203+
$$
204+
205+
which implies that
206+
207+
$$
208+
\left[ A - (1-\lambda) B C \right] \vec \pi^* = (1-\lambda) B \vec \mu+ \vec \pi_0^*
209+
$$
210+
211+
Multiplying both sides of the above equation by the inverse of the matrix on the left side gives
212+
213+
$$
214+
\vec \pi^* = \left[ A - (1-\lambda) B C \right]^{-1} \left[ (1-\lambda) B \vec \mu+ \vec \pi_0^* \right]
215+
$$ (eq:eq4)
216+
217+
Having solved equation {eq}`eq:eq4` for $\vec \pi^*$, we can use equation {eq}`eq:eq2` to solve for $\vec \pi$:
218+
219+
$$
220+
\vec \pi = \vec \mu + C \vec \pi^*
221+
$$
222+
223+
224+
We have thus solved for two of the key endogenous time series determined by our model, namely, the sequence $\vec \pi^*$
225+
of expected inflation rates and the sequence $\vec \pi$ of actual inflation rates.
226+
227+
Knowing these, we can then quickly calculate the associated sequence $\vec p$ of the logarithm of the price level
228+
from equation {eq}`eq:eqfiscth1`.
229+
230+
Let's fill in the details for this step.
231+
<!-- #endregion -->
232+
233+
Since we now know $\vec \mu$ it is easy to compute $\vec m$.
234+
235+
Thus, notice that we can represent the equations
236+
237+
$$
238+
m_{t+1} = m_t + \mu_t , \quad t = 0, 1, \ldots, T
239+
$$
240+
241+
as the matrix equation
242+
243+
$$
244+
\begin{bmatrix}
245+
1 & 0 & 0 & \cdots & 0 & 0 \cr
246+
-1 & 1 & 0 & \cdots & 0 & 0 \cr
247+
0 & -1 & 1 & \cdots & 0 & 0 \cr
248+
\vdots & \vdots & \vdots & \vdots & 0 & 0 \cr
249+
0 & 0 & 0 & \cdots & 1 & 0 \cr
250+
0 & 0 & 0 & \cdots & -1 & 1
251+
\end{bmatrix}
252+
\begin{bmatrix}
253+
m_1 \cr m_2 \cr m_3 \cr \vdots \cr m_T \cr m_{T+1}
254+
\end{bmatrix}
255+
= \begin{bmatrix}
256+
\mu_0 \cr \mu_1 \cr \mu_2 \cr \vdots \cr \mu_{T-1} \cr \mu_T
257+
\end{bmatrix}
258+
+ \begin{bmatrix}
259+
m_0 \cr 0 \cr 0 \cr \vdots \cr 0 \cr 0
260+
\end{bmatrix}
261+
$$ (eq:eq101)
262+
263+
Multiplying both sides of equation {eq}`eq:eq101` with the inverse of the matrix on the left will give
264+
265+
$$
266+
m_t = m_0 + \sum_{s=0}^{t-1} \mu_s, \quad t =1, \ldots, T+1
267+
$$ (eq:mcum)
268+
269+
Equation {eq}`eq:mcum` shows that the log of the money supply at $t$ equals the log $m_0$ of the initial money supply
270+
plus accumulation of rates of money growth between times $0$ and $t$.
271+
272+
We can then compute $p_t$ for each $t$ from equation {eq}`eq:eqfiscth1`.
273+
274+
We can write a compact formula for $\vec p $ as
275+
276+
$$
277+
\vec p = \vec m + \alpha \hat \pi^*
278+
$$
279+
280+
where
281+
282+
$$
283+
\hat \pi^* = \begin{bmatrix} \pi_0^* \cr
284+
\pi_1^* \cr
285+
\pi_2^* \cr
286+
\vdots \cr
287+
\pi_{T}^*
288+
\end{bmatrix},
289+
$$
290+
291+
which is just $\vec \pi^*$ with the last element dropped.
292+
293+
294+
295+
## Forecast Errors
296+
297+
Our computations will verify that
298+
299+
$$
300+
\hat \pi^* \neq \vec \pi,
301+
$$
302+
303+
so that in general
304+
305+
$$
306+
\pi_t^* \neq \pi_t, \quad t = 0, 1, \ldots , T
307+
$$ (eq:notre)
308+
309+
This outcome is typical in models in which adaptive expectations hypothesis like equation {eq}`eq:adaptexpn` appear as a
310+
component.
311+
312+
In this lecture {doc}`fiscal theory of the price level <cagan_ree>`, we studied a version of the model that replaces hypothesis {eq}`eq:adaptexpn` with
313+
a "perfect foresight" or "rational expectations" hypothesis.
314+
315+
```{code-cell} ipython3
316+
Cagan_Adaptive = namedtuple("Cagan_Adaptive",
317+
["α", "m0", "Eπ0", "T", "λ"])
318+
319+
def create_cagan_model(α, m0, Eπ0, T, λ):
320+
return Cagan_Adaptive(α, m0, Eπ0, T, λ)
321+
```
322+
+++ {"user_expressions": []}
323+
324+
Here we define the parameters.
325+
326+
```{code-cell} ipython3
327+
# parameters
328+
T = 80
329+
T1 = 60
330+
α = 5
331+
λ = 0.9 # 0.7
332+
m0 = 1
333+
334+
μ0 = 0.5
335+
μ_star = 0
336+
337+
md = create_cagan_model(α=α, m0=m0, Eπ0=μ0, T=T, λ=λ)
338+
```
339+
+++ {"user_expressions": []}
340+
341+
We solve the model and plot variables of interests using the following functions.
342+
343+
```{code-cell} ipython3
344+
def solve(model, μ_seq):
345+
" Solve the Cagan model in finite time. "
346+
347+
model_params = model.α, model.m0, model.Eπ0, model.T, model.λ
348+
α, m0, Eπ0, T, λ = model_params
349+
350+
A = np.eye(T+2, T+2) - λ*np.eye(T+2, T+2, k=-1)
351+
B = np.eye(T+2, T+1, k=-1)
352+
C = -α*np.eye(T+1, T+2) + α*np.eye(T+1, T+2, k=1)
353+
Eπ0_seq = np.append(Eπ0, np.zeros(T+1))
354+
355+
# Eπ_seq is of length T+2
356+
Eπ_seq = np.linalg.inv(A - (1-λ)*B @ C) @ ((1-λ) * B @ μ_seq + Eπ0_seq)
357+
358+
# π_seq is of length T+1
359+
π_seq = μ_seq + C @ Eπ_seq
360+
361+
D = np.eye(T+1, T+1) - np.eye(T+1, T+1, k=-1)
362+
m0_seq = np.append(m0, np.zeros(T))
363+
364+
# m_seq is of length T+2
365+
m_seq = np.linalg.inv(D) @ (μ_seq + m0_seq)
366+
m_seq = np.append(m0, m_seq)
367+
368+
# p_seq is of length T+2
369+
p_seq = m_seq + α * Eπ_seq
370+
371+
return π_seq, Eπ_seq, m_seq, p_seq
372+
```
373+
374+
+++ {"user_expressions": []}
375+
376+
```{code-cell} ipython3
377+
def solve_and_plot(model, μ_seq):
378+
379+
π_seq, Eπ_seq, m_seq, p_seq = solve(model, μ_seq)
380+
381+
T_seq = range(model.T+2)
382+
383+
fig, ax = plt.subplots(2, 3, figsize=[10,5], dpi=200)
384+
ax[0,0].plot(T_seq[:-1], μ_seq)
385+
ax[0,1].plot(T_seq[:-1], π_seq, label=r'$\pi_t$')
386+
ax[0,1].plot(T_seq, Eπ_seq, label=r'$\pi^{*}_{t}$')
387+
ax[0,2].plot(T_seq, m_seq - p_seq)
388+
ax[1,0].plot(T_seq, m_seq)
389+
ax[1,1].plot(T_seq, p_seq)
390+
391+
x_lab = r'$t$'
392+
y_labs = [r'$\mu$', r'$\pi$', r'$m - p$', r'$m$', r'$p$']
393+
394+
k = 0
395+
for i,j in zip([0, 0, 0, 1, 1], [0, 1, 2, 0, 1]):
396+
ax[i,j].set_xlabel(x_lab)
397+
ax[i,j].set_ylabel(y_labs[k])
398+
k = k + 1
399+
400+
ax[0,1].legend()
401+
ax[1,2].set_axis_off()
402+
plt.tight_layout()
403+
plt.show()
404+
405+
return π_seq, Eπ_seq, m_seq, p_seq
406+
```
407+
408+
+++ {"user_expressions": []}
409+
410+
411+
412+
## Technical condition for stability
413+
414+
In constructing our examples, we shall assume that $(\lambda, \alpha)$ satisfy
415+
416+
$$
417+
\Bigl| \frac{\lambda-\alpha(1-\lambda)}{1-\alpha(1-\lambda)} \Bigr| < 1
418+
$$ (eq:suffcond)
419+
420+
The source of this condition is the following string of deductions:
421+
422+
$$
423+
\begin{align*}
424+
\pi_{t}&=\mu_{t}+\alpha\pi_{t+1}^{*}-\alpha\pi_{t}^{*}\\\pi_{t+1}^{*}&=\lambda\pi_{t}^{*}+(1-\lambda)\pi_{t}\\\pi_{t}&=\frac{\mu_{t}}{1-\alpha(1-\lambda)}-\frac{\alpha(1-\lambda)}{1-\alpha(1-\lambda)}\pi_{t}^{*}\\\implies\pi_{t}^{*}&=\frac{1}{\alpha(1-\lambda)}\mu_{t}-\frac{1-\alpha(1-\lambda)}{\alpha(1-\lambda)}\pi_{t}\\\pi_{t+1}&=\frac{\mu_{t+1}}{1-\alpha(1-\lambda)}-\frac{\alpha(1-\lambda)}{1-\alpha(1-\lambda)}\left(\lambda\pi_{t}^{*}+(1-\lambda)\pi_{t}\right)\\&=\frac{\mu_{t+1}}{1-\alpha(1-\lambda)}-\frac{\lambda}{1-\alpha(1-\lambda)}\mu_{t}+\frac{\lambda-\alpha(1-\lambda)}{1-\alpha(1-\lambda)}\pi_{t}
425+
\end{align*}
426+
$$
427+
428+
By assuring that the coefficient on $\pi_t$ is less than one in absolulte value, condition {eq}`eq:suffcond` assures stability of the dynamics of $\{\pi_t\}$ described by the last line of our string of deductions.
429+
430+
The reader is free to study outcomes in examples that violate condition {eq}`eq:suffcond`.
431+
<!-- #endregion -->
432+
433+
```{code-cell} ipython3
434+
print(np.abs((λ - α*(1-λ))/(1 - α*(1-λ))))
435+
```
436+
+++ {"user_expressions": []}
437+
438+
```{code-cell} ipython3
439+
print(λ - α*(1-λ))
440+
```
441+
+++ {"user_expressions": []}
442+
443+
Now we'll turn to some experiments.
444+
445+
<!-- #region -->
446+
447+
### Experiment 1
448+
449+
We'll study a situation in which the rate of growth of the money supply is $\mu_0$
450+
from $t=0$ to $t= T_1$ and then permanently falls to $\mu^*$ at $t=T_1$.
451+
452+
Thus, let $T_1 \in (0, T)$.
453+
454+
So where $\mu_0 > \mu^*$, we assume that
455+
456+
$$
457+
\mu_{t+1} = \begin{cases}
458+
\mu_0 , & t = 0, \ldots, T_1 -1 \\
459+
\mu^* , & t \geq T_1
460+
\end{cases}
461+
$$
462+
463+
Notice that we studied exactly this experiment in a rational expectations version of the model in this lecture {doc}`fiscal theory of the price level <cagan_ree>`.
464+
465+
So by comparing outcomes across the two lectures, we can learn about consequences of assuming adaptive expectations, as we do here, instead of rational expectations as we assumed in that other lecture.
466+
467+
468+
```{code-cell} ipython3
469+
μ_seq_1 = np.append(μ0*np.ones(T1), μ_star*np.ones(T+1-T1))
470+
471+
# solve and plot
472+
π_seq_1, Eπ_seq_1, m_seq_1, p_seq_1 = solve_and_plot(md, μ_seq_1)
473+
```
474+
+++ {"user_expressions": []}
475+
476+
We invite the reader to compare outcomes with those under rational expectations studied in this lecture {doc}`fiscal theory of the price level <cagan_ree>`.
477+
478+
Please note how the actual inflation rate $\pi_t$ "overshoots" its ultimate steady-state value at the time of the sudden reduction in the rate of growth of the money supply at time $T_1$.
479+
480+
We invite you to explain to yourself the source of this overshooting and why it does not occur in the rational expectations version of the model.
481+
482+
### Experiment 2
483+
484+
Now we'll do a different experiment, namely, a gradual stabilization in which the rate of growth of the money supply smoothly
485+
decline from a high value to a persistently low value.
486+
487+
While price level inflation eventually falls, it falls more slowly than the driving force that ultimately causes it to fall, namely, the falling rate of growth of the money supply.
488+
489+
The sluggish fall in inflation is explained by how anticipated inflation $\pi_t^*$ persistently exceeds actual inflation $\pi_t$ during the transition from a high inflation to a low inflation situation.
490+
491+
```{code-cell} ipython3
492+
# parameters
493+
ϕ = 0.9
494+
μ_seq_2 = np.array([ϕ**t * μ0 + (1-ϕ**t)*μ_star for t in range(T)])
495+
μ_seq_2 = np.append(μ_seq_2, μ_star)
496+
497+
498+
# solve and plot
499+
π_seq_2, Eπ_seq_2, m_seq_2, p_seq_2 = solve_and_plot(md, μ_seq_2)
500+
```
501+
+++ {"user_expressions": []}

‎lectures/cagan_ree.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ In those experiments, we'll encounter an instance of a ''velocity dividend'' tha
5050

5151
To facilitate using linear matrix algebra as our main mathematical tool, we'll use a finite horizon version of the model.
5252

53-
As in the {doc}`present values <pv>` and {doc}`consumption smoothing<cons_smooth>` lectures, the only linear algebra that we'll be using
54-
are matrix multplication and matrix inversion.
53+
As in the {doc}`present values <pv>` and {doc}`consumption smoothing<cons_smooth>` lectures, the only linear algebra that we'll be using are matrix multplication and matrix inversion.
5554

5655

5756
## Structure of the Model
@@ -293,7 +292,7 @@ $$
293292
294293
so that, in terms of our notation and formula for $\theta_{T+1}^*$ above, $\tilde \gamma = 1$.
295294
296-
#### Experiment 1: foreseen sudden stabilization
295+
#### Experiment 1: Foreseen sudden stabilization
297296
298297
In this experiment, we'll study how, when $\alpha >0$, a foreseen inflation stabilization has effects on inflation that proceed it.
299298

1 commit comments

Comments
 (1)
Please sign in to comment.