import%20marimo%0A%0A__generated_with%20%3D%20%220.13.0%22%0Aapp%20%3D%20marimo.App(%0A%20%20%20%20width%3D%22medium%22%2C%0A%20%20%20%20app_title%3D%22Week%201%20%E2%80%94%20What%20is%20a%20mathematical%20model%3F%22%2C%0A)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Week%201%3A%20What%20is%20a%20mathematical%20model%3F%0A%20%20%20%20%23%23%20Computation%20lecture%0A%0A%20%20%20%20**MATH4120%20%E2%80%94%20Mathematical%20Modelling%20and%20Programming**%0A%20%20%20%20Lancaster%20University%2C%202026%E2%80%9327%0A%0A%20%20%20%20---%0A%0A%20%20%20%20In%20lectures%20this%20week%20we%20introduced%20the%20**modelling%20cycle**%20and%20worked%20through%0A%20%20%20%20the%20rumour-spreading%20example.%20%20Here%20we%20apply%20the%20same%20cycle%20computationally%20%E2%80%94%0A%20%20%20%20first%20to%20a%20discrete%20population%20model%2C%20then%20to%20a%20draining%20tank.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%200.%20How%20this%20notebook%20works%0A%0A%20%20%20%20This%20notebook%20interleaves%20code%20cells%20(grey%20background)%20with%20text%20cells%20like%20this%20one%2C%0A%20%20%20%20written%20in%20**Markdown**.%20%20Markdown%20is%20how%20you%20will%20narrate%20your%20own%20solutions.%0A%0A%20%20%20%20%7C%20What%20you%20type%20%7C%20What%20you%20see%20%7C%0A%20%20%20%20%7C---%7C---%7C%0A%20%20%20%20%7C%20%60**bold**%60%20%7C%20**bold**%20%7C%0A%20%20%20%20%7C%20%60*italic*%60%20%7C%20*italic*%20%7C%0A%20%20%20%20%7C%20%60%23%23%20Heading%60%20%7C%20a%20section%20heading%20%7C%0A%20%20%20%20%7C%20%60%24r%20N%24%60%20%7C%20%24r%20N%24%20(inline%20maths)%20%7C%0A%20%20%20%20%7C%20%60%24%24%5Cfrac%7BdN%7D%7Bdt%7D%20%3D%20rN%24%24%60%20%7C%20%24%24%5Cfrac%7BdN%7D%7Bdt%7D%20%3D%20rN%24%24%20%7C%0A%0A%20%20%20%20The%20maths%20uses%20**LaTeX**%20%E2%80%94%20the%20same%20notation%20as%20the%20printed%20lecture%20notes.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%201.%20The%20modelling%20cycle%0A%0A%20%20%20%201.%20**Observe**%20%E2%80%94%20identify%20the%20phenomenon%20and%20the%20question.%0A%20%20%20%202.%20**Simplify**%20%E2%80%94%20make%20assumptions%20to%20make%20the%20problem%20tractable.%0A%20%20%20%203.%20**Formulate**%20%E2%80%94%20express%20those%20assumptions%20as%20equations.%0A%20%20%20%204.%20**Solve**%20%E2%80%94%20analytically%20or%20numerically.%0A%20%20%20%205.%20**Interpret**%20%E2%80%94%20translate%20the%20output%20back%20into%20real-world%20terms.%0A%20%20%20%206.%20**Validate**%20%E2%80%94%20compare%20with%20data%20or%20known%20behaviour.%0A%20%20%20%207.%20**Refine**%20%E2%80%94%20relax%20assumptions%2C%20add%20complexity%2C%20repeat.%0A%0A%20%20%20%20The%20lecture%20notes%20work%20through%20the%20**rumour-spreading**%20example%20step%20by%20step.%0A%20%20%20%20Here%20we%20demonstrate%20the%20cycle%20on%20two%20computational%20examples.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20from%20scipy.integrate%20import%20solve_ivp%0A%20%20%20%20return%20np%2C%20plt%2C%20solve_ivp%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.%20Discrete%20model%3A%20geometric%20growth%0A%0A%20%20%20%20An%20insect%20species%20breeds%20once%20per%20year.%20%20Let%20%24N_n%24%20be%20the%20population%20in%20year%20%24n%24.%0A%20%20%20%20The%20simplest%20rule%3A%20each%20generation%20is%20a%20fixed%20multiple%20of%20the%20previous%20one%2C%0A%0A%20%20%20%20%24%24N_%7Bn%2B1%7D%20%3D%20R%5C%2CN_n%2C%20%5Cqquad%20N_0%20%5Ctext%7B%20given.%7D%24%24%0A%0A%20%20%20%20This%20is%20a%20**difference%20equation**.%20%20No%20calculus%20needed%3A%20given%20%24R%24%20and%20%24N_0%24%2C%0A%20%20%20%20the%20whole%20sequence%20follows%20by%20iteration.%20%20The%20closed%20form%20is%20%24N_n%20%3D%20R%5En%20N_0%24.%0A%0A%20%20%20%20-%20%24R%20%3E%201%24%3A%20unbounded%20growth.%20%24%5Cquad%20R%20%3C%201%24%3A%20decay%20to%20zero.%20%24%5Cquad%20R%20%3D%201%24%3A%20constant.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20R_slider%20%3D%20mo.ui.slider(start%3D0.5%2C%20stop%3D3.0%2C%20step%3D0.1%2C%20value%3D1.5%2C%20label%3D%22Growth%20factor%20R%22)%0A%20%20%20%20N0_disc_slider%20%3D%20mo.ui.slider(start%3D10%2C%20stop%3D200%2C%20step%3D10%2C%20value%3D50%2C%20label%3D%22Initial%20population%20N%E2%82%80%22)%0A%20%20%20%20n_gen_slider%20%3D%20mo.ui.slider(start%3D5%2C%20stop%3D30%2C%20step%3D1%2C%20value%3D15%2C%20label%3D%22Generations%22)%0A%20%20%20%20mo.vstack(%5BR_slider%2C%20N0_disc_slider%2C%20n_gen_slider%5D)%0A%20%20%20%20return%20N0_disc_slider%2C%20R_slider%2C%20n_gen_slider%0A%0A%0A%40app.cell%0Adef%20_(N0_disc_slider%2C%20R_slider%2C%20n_gen_slider%2C%20np%2C%20plt)%3A%0A%20%20%20%20R_d%20%3D%20R_slider.value%0A%20%20%20%20N0_d%20%3D%20N0_disc_slider.value%0A%20%20%20%20n_d%20%3D%20n_gen_slider.value%0A%0A%20%20%20%20n_disc%20%3D%20np.arange(n_d%20%2B%201)%0A%20%20%20%20N_geom%20%3D%20N0_d%20*%20R_d%20**%20n_disc%0A%0A%20%20%20%20fig_disc%2C%20ax_disc%20%3D%20plt.subplots(figsize%3D(8%2C%204))%0A%20%20%20%20ax_disc.stem(n_disc%2C%20N_geom%2C%20linefmt%3D%22%231a5276%22%2C%20markerfmt%3D%22C0o%22%2C%20basefmt%3D%22k-%22)%0A%20%20%20%20ax_disc.set_xlabel(%22Generation%20%24n%24%22%2C%20fontsize%3D13)%0A%20%20%20%20ax_disc.set_ylabel(%22Population%20%24N_n%24%22%2C%20fontsize%3D13)%0A%20%20%20%20ax_disc.set_title(%0A%20%20%20%20%20%20%20%20f%22Geometric%20growth%20%20%24N_n%20%3D%20R%5En%20N_0%24%20%20%20(%24R%20%3D%20%7BR_d%7D%24%2C%20%20%24N_0%20%3D%20%7BN0_d%7D%24)%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D12%2C%0A%20%20%20%20)%0A%20%20%20%20ax_disc.grid(True%2C%20alpha%3D0.3)%0A%20%20%20%20fig_disc.tight_layout()%0A%20%20%20%20fig_disc%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%203.%20From%20discrete%20to%20continuous%0A%0A%20%20%20%20Suppose%20the%20time%20step%20between%20generations%20is%20%24h%24%20(small).%20%20The%20multiplicative%20factor%0A%20%20%20%20per%20step%20is%20%24R%20%3D%20e%5E%7Brh%7D%24%2C%20where%20%24r%24%20is%20the%20continuous%20per-capita%20growth%20rate.%0A%20%20%20%20As%20%24h%20%5Cto%200%24%20the%20difference%20equation%20passes%20to%20the%20limit%0A%0A%20%20%20%20%24%24%5Cfrac%7BdN%7D%7Bdt%7D%20%3D%20r%20N%2C%20%5Cqquad%20N(0)%20%3D%20N_0%2C%20%5Cqquad%20%5Ctext%7Bsolution%3A%20%7D%20N(t)%20%3D%20N_0%20e%5E%7Brt%7D.%24%24%0A%0A%20%20%20%20With%20%24h%20%3D%201%24%20year%20and%20%24R%20%3D%20e%5Er%24%2C%20discrete%20and%20continuous%20are%20the%20same%20process%0A%20%20%20%20sampled%20at%20different%20resolutions.%20%20The%20exponential%20curve%20passes%20through%20each%20stem.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(N0_disc_slider%2C%20R_slider%2C%20n_gen_slider%2C%20np%2C%20plt)%3A%0A%20%20%20%20R_b%20%3D%20R_slider.value%0A%20%20%20%20N0_b%20%3D%20N0_disc_slider.value%0A%20%20%20%20n_b%20%3D%20n_gen_slider.value%0A%0A%20%20%20%20n_both%20%3D%20np.arange(n_b%20%2B%201)%0A%20%20%20%20N_both_disc%20%3D%20N0_b%20*%20R_b%20**%20n_both%0A%0A%20%20%20%20r_cont%20%3D%20np.log(max(R_b%2C%201e-9))%20%20%20%23%20r%20such%20that%20e%5Er%20%3D%20R%20%20(one-year%20steps)%0A%20%20%20%20t_cont%20%3D%20np.linspace(0%2C%20n_b%2C%20400)%0A%20%20%20%20N_cont%20%3D%20N0_b%20*%20np.exp(r_cont%20*%20t_cont)%0A%0A%20%20%20%20fig_both%2C%20ax_both%20%3D%20plt.subplots(figsize%3D(8%2C%204))%0A%20%20%20%20ax_both.plot(t_cont%2C%20N_cont%2C%20color%3D%22%231a5276%22%2C%20linewidth%3D2.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3Drf%22Continuous%3A%20%24N_0%5C%2Ce%5E%7B%7Brt%7D%7D%24%2C%20%20%24r%20%3D%20%5Cln%20R%20%3D%20%7Br_cont%3A.3f%7D%24%22)%0A%20%20%20%20ax_both.stem(n_both%2C%20N_both_disc%2C%20linefmt%3D%22grey%22%2C%20markerfmt%3D%22ko%22%2C%20basefmt%3D%22%20%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Discrete%3A%20%24R%5En%20N_0%24%22)%0A%20%20%20%20ax_both.set_xlabel(%22Time%20(years)%22%2C%20fontsize%3D13)%0A%20%20%20%20ax_both.set_ylabel(%22Population%22%2C%20fontsize%3D13)%0A%20%20%20%20ax_both.set_title(%22Discrete%20and%20continuous%20models%20%E2%80%94%20same%20parameters%2C%20two%20frameworks%22%2C%20fontsize%3D12)%0A%20%20%20%20ax_both.legend(fontsize%3D11)%0A%20%20%20%20ax_both.grid(True%2C%20alpha%3D0.3)%0A%20%20%20%20fig_both.tight_layout()%0A%20%20%20%20fig_both%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%204.%20A%20different%20model%3A%20the%20draining%20tank%0A%0A%20%20%20%20Not%20every%20model%20gives%20exponential%20behaviour.%20%20We%20now%20apply%20the%20full%20modelling%20cycle%0A%20%20%20%20to%20a%20tank%20draining%20under%20gravity%20%E2%80%94%20worked%20through%20analytically%20in%20the%20lecture%20notes.%0A%0A%20%20%20%20**Observe.**%20%20Water%20flows%20out%20through%20a%20small%20hole%20at%20the%20bottom.%20%20The%20flow%20rate%0A%20%20%20%20is%20fast%20when%20the%20tank%20is%20full%20and%20slows%20as%20the%20depth%20drops.%0A%0A%20%20%20%20**Simplify.**%0A%20%20%20%20-%20Vertical%20cylinder%2C%20constant%20cross-sectional%20area%20%24A%24.%0A%20%20%20%20-%20Small%20hole%2C%20area%20%24a%20%5Cll%20A%24%2C%20at%20the%20base.%20%20No%20viscosity%2C%20swirl%2C%20or%20surface%20effects.%0A%0A%20%20%20%20**Formulate.**%20%20Let%20%24h(t)%24%20be%20the%20depth.%20%20Conservation%20of%20volume%20gives%0A%20%20%20%20%24A%5Cdot%7Bh%7D%20%3D%20-Q%24.%20%20Torricelli's%20law%20(energy%20conservation)%20gives%20outflow%20speed%0A%20%20%20%20%24v%20%3D%20%5Csqrt%7B2gh%7D%24%2C%20so%20%24Q%20%3D%20a%5Csqrt%7B2gh%7D%24.%20%20Together%3A%0A%0A%20%20%20%20%24%24%5Cfrac%7Bdh%7D%7Bdt%7D%20%3D%20-%5Cfrac%7Ba%7D%7BA%7D%5Csqrt%7B2g%5C%2Ch%7D.%24%24%0A%0A%20%20%20%20**Dimensional%20check.**%20%20%24%5Ba%2FA%5D%20%3D%201%24%2C%20%20%24%5Cbigl%5B%5Csqrt%7B2gh%7D%5Cbigr%5D%20%3D%20%5Cmathrm%7Bm%5C%2Cs%5E%7B-1%7D%7D%24%2C%0A%20%20%20%20so%20the%20right-hand%20side%20has%20dimensions%20%24%5Cmathrm%7Bm%5C%2Cs%5E%7B-1%7D%7D%24%20%E2%80%94%20matching%20%24%5B%5Cdot%7Bh%7D%5D%24.%20%E2%9C%93%0A%0A%20%20%20%20**Solve.**%20%20Separation%20of%20variables%20gives%20the%20exact%20solution%0A%20%20%20%20%24%24h(t)%20%3D%20h_0%5C!%5Cleft(1%20-%20%5Cfrac%7Bt%7D%7Bt_%5Cmathrm%7Bdrain%7D%7D%5Cright)%5E%7B%5C!2%7D%2C%20%5Cqquad%0A%20%20%20%20t_%5Cmathrm%7Bdrain%7D%20%3D%20%5Cfrac%7BA%7D%7Ba%7D%5Csqrt%7B%5Cfrac%7B2h_0%7D%7Bg%7D%7D.%24%24%0A%0A%20%20%20%20Below%3A%20numerical%20(%60solve_ivp%60)%20and%20analytic%20solutions%20overlaid.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20h0_slider%20%3D%20mo.ui.slider(start%3D0.5%2C%20stop%3D5.0%2C%20step%3D0.5%2C%20value%3D2.0%2C%20label%3D%22Initial%20depth%20h%E2%82%80%20(m)%22)%0A%20%20%20%20ratio_slider%20%3D%20mo.ui.slider(start%3D0.001%2C%20stop%3D0.02%2C%20step%3D0.001%2C%20value%3D0.005%2C%20label%3D%22Area%20ratio%20a%2FA%22)%0A%20%20%20%20steps_slider%20%3D%20mo.ui.slider(start%3D5%2C%20stop%3D300%2C%20step%3D5%2C%20value%3D10%2C%20label%3D%22Solver%20steps%20(max%20per%20interval)%22)%0A%20%20%20%20mo.vstack(%5Bh0_slider%2C%20ratio_slider%2C%20steps_slider%5D)%0A%20%20%20%20return%20h0_slider%2C%20ratio_slider%2C%20steps_slider%0A%0A%0A%40app.cell%0Adef%20_(h0_slider%2C%20np%2C%20plt%2C%20ratio_slider%2C%20solve_ivp%2C%20steps_slider)%3A%0A%20%20%20%20h0_tank%20%3D%20h0_slider.value%0A%20%20%20%20aA%20%3D%20ratio_slider.value%0A%20%20%20%20n_steps_tank%20%3D%20steps_slider.value%0A%20%20%20%20g%20%3D%209.81%0A%0A%20%20%20%20c_tank%20%3D%20aA%20*%20np.sqrt(2%20*%20g)%20%20%20%20%20%20%20%20%20%20%23%20shorthand%3A%20(a%2FA)%20sqrt(2g)%0A%20%20%20%20t_drain%20%3D%202%20*%20np.sqrt(h0_tank)%20%2F%20c_tank%0A%0A%20%20%20%20t_eval_tank%20%3D%20np.linspace(0%2C%20t_drain%20*%201.05%2C%20400)%0A%20%20%20%20h_exact%20%3D%20h0_tank%20*%20np.maximum(1%20-%20t_eval_tank%20%2F%20t_drain%2C%200.0)%20**%202%0A%0A%20%20%20%20def%20tank_ode(t%2C%20h)%3A%0A%20%20%20%20%20%20%20%20return%20%5B-c_tank%20*%20np.sqrt(max(h%5B0%5D%2C%200.0))%5D%0A%0A%20%20%20%20sol_tank%20%3D%20solve_ivp(%0A%20%20%20%20%20%20%20%20tank_ode%2C%20%5B0%2C%20t_drain%20*%201.05%5D%2C%20%5Bh0_tank%5D%2C%0A%20%20%20%20%20%20%20%20t_eval%3Dt_eval_tank%2C%20max_step%3Dt_drain%20*%201.05%20%2F%20n_steps_tank%2C%0A%20%20%20%20)%0A%0A%20%20%20%20fig_tank%2C%20ax_tank%20%3D%20plt.subplots(figsize%3D(8%2C%204))%0A%20%20%20%20ax_tank.plot(t_eval_tank%2C%20h_exact%2C%20color%3D%22%231a5276%22%2C%20linewidth%3D2.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3Dr%22Analytic%3A%20%24h_0%5C!%5Cleft(1%20-%20t%2Ft_%5Cmathrm%7Bdrain%7D%5Cright)%5E2%24%22)%0A%20%20%20%20ax_tank.plot(sol_tank.t%2C%20sol_tank.y%5B0%5D%2C%20color%3D%22tomato%22%2C%20linewidth%3D2%2C%20linestyle%3D%22--%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3Df%22solve_ivp%20(RK45%2C%20%E2%89%A4%7Bn_steps_tank%7D%20steps)%22)%0A%20%20%20%20ax_tank.axvline(t_drain%2C%20color%3D%22grey%22%2C%20linestyle%3D%22%3A%22%2C%20linewidth%3D1.5)%0A%20%20%20%20ax_tank.text(%0A%20%20%20%20%20%20%20%20t_drain%20*%200.76%2C%20h0_tank%20*%200.55%2C%0A%20%20%20%20%20%20%20%20f%22%24t_%5C%5Cmathrm%7B%7Bdrain%7D%7D%20%3D%20%7Bt_drain%3A.1f%7D%5C%5C%2C%5C%5Cmathrm%7B%7Bs%7D%7D%24%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D11%2C%20color%3D%22grey%22%2C%0A%20%20%20%20)%0A%20%20%20%20ax_tank.set_xlabel(%22Time%20%24t%24%20(s)%22%2C%20fontsize%3D13)%0A%20%20%20%20ax_tank.set_ylabel(%22Depth%20%24h(t)%24%20(m)%22%2C%20fontsize%3D13)%0A%20%20%20%20ax_tank.set_title(%0A%20%20%20%20%20%20%20%20f%22Draining%20tank%20%20%20(%24h_0%20%3D%20%7Bh0_tank%7D%5C%5C%2C%5C%5Cmathrm%7B%7Bm%7D%7D%24%2C%20%20%24a%2FA%20%3D%20%7BaA%7D%24)%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D13%2C%0A%20%20%20%20)%0A%20%20%20%20ax_tank.legend(fontsize%3D11)%0A%20%20%20%20ax_tank.grid(True%2C%20alpha%3D0.3)%0A%20%20%20%20fig_tank.tight_layout()%0A%20%20%20%20fig_tank%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20**Interpret.**%20%20The%20curve%20is%20concave%20up%3A%20draining%20is%20fastest%20at%20the%20start%20and%20slows%0A%20%20%20%20to%20a%20trickle.%20%20This%20is%20qualitatively%20different%20from%20the%20exponential%20%E2%80%94%20there%20is%20a%0A%20%20%20%20*finite*%20drain%20time%20rather%20than%20an%20asymptotic%20approach.%0A%0A%20%20%20%20The%20drain%20time%20scales%20as%20%24%5Csqrt%7Bh_0%7D%24%3A%20doubling%20%24h_0%24%20multiplies%20%24t_%5Cmathrm%7Bdrain%7D%24%0A%20%20%20%20by%20%24%5Csqrt%7B2%7D%20%5Capprox%201.41%24%2C%20not%202.%0A%0A%20%20%20%20**Refine.**%20%20Real%20tanks%20lose%20efficiency%20at%20the%20hole%20due%20to%20viscosity.%20%20Engineers%0A%20%20%20%20multiply%20%24Q%24%20by%20a%20discharge%20coefficient%20%24C_d%20%5Capprox%200.6%24%2C%20replacing%0A%20%20%20%20%24c%20%3D%20(a%2FA)%5Csqrt%7B2g%7D%24%20by%20%24C_d%5C%2C(a%2FA)%5Csqrt%7B2g%7D%24.%20%20The%20model%20structure%20is%20unchanged%3B%0A%20%20%20%20only%20one%20parameter%20shifts.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
3c87db70cc076fdc010f300486013131d54a59dbc29a0374c6a3dedaa0190f72